JS之作用域浅谈

这几天看了一下JS高级程序设计里的介绍作用域的章节,也参考了网上的资料,现在结合着自己的理解,给大家分享一下我自己对JS作用域的理解。

作用域及执行环境

这里有三个重要的概念:执行环境、作用域、变量对象

(JS高级程序设计解释)
执行环境 :定义变量或函数可访问的其他数据,来决定它们的行为。
变量对象 :保存执行环境中定义的变量和函数。
作用域链 :保证对环境中定义的变量和函数的有序访问。

通俗来说,执行环境和作用域就是变量或函数有效执行所在的一个环境。
总结一下这三者的关系:每个执行环境执行时都会产生一个作用域,作用域前端都有一个变量对象来保存环境中的变量和函数。

知道这3个重要概念后,要想搞清作用域,就要先清楚JS程序的预解析过程
JS程序开始执行时会先解析语法(检查错误等等)、解析内存,然后把function、var解析到变量对象里。
这里注意解析var变量时只是会把变量名称解析,而等到程序运行到变量赋值时才会向变量赋值。

var a="A";
function test(){
    console.log(a);//undefined
    var a="B";
}
test();

这段代码的第一个console.log之所以会是undefined,原因是函数内部的a变量在预解析时已经被解析到变量对象里,但没被赋值。所以函数执行时找到函数里未被赋值的a变量,输出undefined。

搞清楚预解析后,在判断作用域范围
因为作用域的查找顺序是由局部作用域一步步地往上找,直到找到声明的变量和函数或已经到了全局作用域。所以局部的作用域可以访问到外部作用域的变量,而外部作用域访问不到内部作用域的变量。

相关场景

var a="A";
function test(){
    console.log(a);//“A”
    a="B";
}
test();
console.log(a);//"B"  
function test(){  
      b();//函数b会被预解析,因此可以调用,执行了输出1;
      var a=1;
      function b(){
          console.log(1);
          console.log(a);//undefined
          var a=2;
      }
}
test();

以上例子参考网上资料。

总结

要想搞清作用域,首先要搞清预解析,然后判断作用域范围,先判断本层环境有无声明及赋值,如果有声明,则判断调用前是否赋值。如果找不到声明,则一层层往外部的作用域找,直到全局环境也找不到时,通常就会报错。

如果有解释的不对或不清晰的,欢迎留言讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值