JS函数作用域及作用域链理解

血红的双手。 提交于 2019-12-30 12:37:15

JS函数作用域及作用域链理解

从事web开发工作,难免会对客户端语言JavaScript一些概念有些似懂非懂的,甚至仅停留在实现功能的层面上,接下来的文章,是记录我对JavaScript的一些概念的理解。

变量作用域

在JavaScript中全局变量的作用域比较简单,它的作用域是全局的,在代码的任何地方都是有定义的。然而函数的参数和局部变量只在函数体内有定义。另外局部变量的优先级要高于同名的全局变量,也就是说当局部变量与全局变量重名时,局部变量会覆盖全局变量(如下面例子)。

  var num = 1;      //声明一个全局变量

  function func() {
    var num = 2;    //声明一个局部变量return num;
  }

  console.log(func());  //输出:2

注:声明局部变量时一定要使用var,否则,解释器会将该变量当做全局对象window的属性。

函数作用域

在JavaScript中使用的是函数作用域(变量在声明它们的函数体以及这个函数体嵌套的任意函数体都是有定义的)。(如下面的例子)

 function func() {

    console.log(num);      
//输出:undefined,而非报错,因为变量num在整个函数体内都是有定义的
    var num = 1;        //声明num 在整个函数体func内都有定义
      console.log(num);      //输出:1
    }

 func();

注:JavaScript的函数作用域是指在在函数内声明的所有变量在函数体内始终是可见的,也就是说在函数体内变量声明之前就已经可用了。

作为属性的变量

当声明一个全局变量的时候,实际上是定义了全局对象window的一个属性。

 var num = 1;      //声明全变量num
alert(window.num)    //输出:1 声明的全局变量实际上就是声明了一个window对象的属性

作用域链

在JavaScript中,函数也是对象,实际上,JavaScript里一切都是对象。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是[[Scope]],该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。

当一个函数创建后,它实际上保存一个作用域链,并且作用域链会被创建此函数的作用域中可访问的数据对象填充。例如定义下面这样一个函数:

 function func() {
      var num = 1;
      alert(num);
   }
 func();
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!