预解析、作用域

文章详细介绍了JavaScript中的预解析机制,包括函数声明的提升、变量的提升以及函数与变量名冲突时的处理。同时,阐述了全局作用域和局部作用域的概念,以及它们的生命周期。还提到了隐式全局变量的产生情况,并通过一个案例分析了预解析后的代码执行顺序。
摘要由CSDN通过智能技术生成

预解析

JavaScript引擎在对JavaScript代码进行解释执行之前,会对JavaScript代码进行预解析,在预解析阶段,会将以关键字var和function开头的语句块提前进行处理。

预解析的情况

1.函数声明会提升
2.函数表达式不会提升
3.变量的提升,变量提升但赋值不会提升
4.变量名与函数名相同时,函数会提升 变量不会
5.提升不会超出作用域范围

作用域

全局作用域

直接编写在 script 标签之中的JS代码,都是全局作用域;
  或者是一个单独的 JS 文件中的。
  全局作用域在页面打开时创建,页面关闭时销毁;
  在全局作用域中有一个全局对象 window(代表的是一个浏览器的窗口,由浏览器创建),可以直接使用。
所有创建的变量都会作为 window 对象的属性保存。

局部作用域(函数作用域)

在函数内部就是局部作用域,这个代码的名字只在函数的内部起作用
  调用函数时创建函数作用域,函数执行完毕之后,函数作用域销毁;
每调用一次函数就会创建一个新的函数作用域,它们之间是相互独立的。

隐式全局变量

1.不用var声明的变量
2.用var声明且用;隔开的也是全局变量
3.用var声明,且用=连接的也是全局变量

案例

原题

function test() {
      console.log(a);
      console.log(b);
      var b = 234;
      console.log(b);
      a = 123;
      console.log(a);
      function a() {}
      var a;
      b = 234;
      var b = function () {};
      console.log(a);
      console.log(b);
    }
    test();

预解析后

function test() {
        function a() {}
        var b;
      console.log(a);  //f(){}
      console.log(b);  //undefined
      b = 234;
      console.log(b); //234
      a = 123;
      console.log(a); //123
      var a;
      b = 234;
      var b = function () {};
      console.log(a); //123
      console.log(b); //f(){}
    }
    test();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值