JS的作用域链

基本简介

作用域链(scope chain)

JavaScript里一切都是对象,包括函数。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是作用域,包含了函数被创建的作用域中对象的集合,称为函数的作用域链,它决定了哪些数据能被函数访问。当一个函数创建后,它的作用域链会被创建此函数的作用域中可访问的数据对象填充。

作用域链创建:

当定义一个函数时,就业局保存一个作用域链。

当调用这个函数时,它创建一个新的对象来储存它的参数或局部变量,并将这个对象添加保存至那个作用域链上,同时创建一个新的更长的表示函数调用作用域的“链”。

对于嵌套函数来说:每次调用外部函数的时候,内部函数又会重新定义一遍。因为每次调用外部函数的时候,作用域链都是不同的。内部函数在每次定义的时候都要微妙的差别---在每次调用外部函数时,内部函数的代码都是相同的,而且关联这段代码的作用域链也不相同。

例子
 var name="Li Ming";
function infor(){
  var name="Wang Yang";
  function infor1(){
    var name="Han mei mei";
    console.log(name);//Han mei mei
  }
  function infor2(){
    console.log(name);// Wang Yang
  }
  infor1();
 infor2();
}
infor();

此嵌套函数有三个函数,对应的作用域链上有三个对象。当需要输出name值时,就在作用域链上找。

当调用infor()时,先后声明infor1和infor2,当成功调用info1()时,在info1内的作用域中找到了name的值,返回“Han mei mei”,结束。
当成功调用infor2()时,在infor2的作用域内未找到name的值,继续向上搜索,在infor内找到了name的值,返回"Wang Yang",结束。

作用域链是由一系列变量对象组成,我们可以在这个单向通道中,查询变量对象中的标识符,这样就可以访问到上一层作用域中的变量了。

你可能感兴趣的:(JS的作用域链)