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",结束。

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 我们都知道js是一个基于对象的语言,系统内置各种对象。 而window作为一个天然存在的全局对象,它承担了所有全局...
    Eric_V阅读 1,729评论 0 0
  • 在之前的文章中我已经介绍了执行上下文的变量对象。在这一篇文章我要介绍执行上下文的作用域链了。 执行上下文.作用域链...
    csRyan阅读 9,263评论 1 17
  • JS的作用域链 在一般情况下我们在最外层声明的变量作用域是全局作用域,全局作用域指的是在当前windows下面的一...
    湾里晴空阅读 2,350评论 0 0
  • 作用域链的概念对理解闭包至关重要 先来一个例子 1.当代码进入Global Execution Context后,...
    bruce_zhou阅读 11,473评论 5 21
  • 我的家乡在河北,这里不仅物产丰富,而且风景优美。 春天,一块块的麦田,像春姑娘送给地球爷爷的绿色地毯。走进田野,一...
    米粒儿zzy阅读 1,742评论 0 2

友情链接更多精彩内容