资讯专栏INFORMATION COLUMN

作用域与作用域链

Invoker / 587人阅读

摘要:作用域首先分为两个部分全局作用域和局部作用域。局部作用域在函数内部声明的变量和函数保存在函数的局部作用域中。作用域链作用域链是因为函数发生了嵌套,当一个函数嵌套在另一个函数内就发生了作用域的嵌套。

1.作用域
比较复杂的说法是根据名称来查找变量的一套规则,还有的说法是变量数据的集合。作用域其实是指一个包含了所有在同一个区域声明的变量和函数的集合,那么如何决定这些变量数据和函数是属于同一区域的呢?这就由他们最初声明时的位置来决定的。作用域首先分为两个部分:全局作用域和局部作用域。
全局作用域:在代码任何地方都可以访问到的变量和函数保存在全局作用域中。
定义在全局的(最外层的)变量和函数:

这段代码中,变量a和函数Foo定义在最外层,所以在代码的任何地方都可以访问到他们。
未声明的变量,自动定义为全局变量:

变量a没有声明,但对它进行了赋值,这不是一个错误的操作,因为引擎会默认的将变量a声明为全局变量。
局部作用域:在函数内部声明的变量和函数保存在函数的局部作用域中。

变量a是全局变量,所以在函数bar的内部可以访问到a,变量c定义在函数bar内部,所以c是存在在函数bar的局部作用域中。函数bar定义在函数Foo内部,所以在全局作用域中找不到这个函数,当试图去访问它时,会有ReferenceError。变量b同理也无法在外部作用域中被访问。
这段代码中,console.log(a+b+c)输出9,函数bar内部只定义了变量c,但是他却可以访问到外部的变量a和b,这就引出了下面所要讨论的作用域链。
2.作用域链
作用域链是因为函数发生了嵌套,当一个函数嵌套在另一个函数内就发生了作用域的嵌套。当一个函数要查找变量时,它会从自已的作用域开始查找,如果找不到就向上一级,找嵌套自己的父级作用域,这样一级一级的查找,知道找到为止,或者到最外层作用域(全局作用域)。

函数bar需要访问三个变量:a、b、c,首先会查找自己的局部作用域,只找到了声明在内部的变量c,所以向上一级查找,就到了嵌套它的函数,也就是他的父级Foo函数的局部作用域,在Foo的局部作用域中找到了需要的变量a和b。这里注意一下,全局作用域中也有一个相同命名的变量a,但是当查找到需要的变量时,搜索就会停止,不会再进行下去,所以全局作用域中a不会被搜索。

参考资料:
1.YOU DON"T KNOW JS ,KYLE SIMPSON

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/87068.html

相关文章

  • 【7】JavaScript 函数高级——作用域与作用域链

    摘要:函数高级作用域与作用域链一作用域作用域个数定义的函数个数全局作用域理解就是一块地盘一个代码段所在的区域。函数执行上下文环境是在调用函数时函数体代码执行之前创建。 JavaScript函数高级——作用域与作用域链 一、作用域 作用域个数 = n(定义的函数个数) + 1(全局作用域)(1)理解 就是一块地盘, 一个代码段所在的区域。 它是静态的(相对于上下文对象), 在编写代码时就确定...

    lentrue 评论0 收藏0
  • 进击JavaScript之(二)词法作用域与作用域链

    摘要:一作用域域表示的就是范围,即作用域,就是一个名字在什么地方可以使用,什么时候不能使用。概括的说作用域就是一套设计良好的规则来存储变量,并且之后可以方便地找到这些变量。 一、作用域 域表示的就是范围,即作用域,就是一个名字在什么地方可以使用,什么时候不能使用。想了解更多关于作用域的问题推荐阅读《你不知道的JavaScript上卷》第一章(或第一部分),从编译原理的角度说明什么是作用域。概...

    denson 评论0 收藏0
  • Javascript重温OOP之作用域与闭包

    摘要:的变量作用域是基于其特有的作用域链的。需要注意的是,用创建的函数,其作用域指向全局作用域。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。 作用域 定义 在编程语言中,作用域控制着变量与参数的可见性及生命周期,它能减少名称冲突,而且提供了自动内存管理 --javascript 语言精粹 我理解的是,一个变量、函数或者成员可以在代码中访问到的范围。 js的变量作...

    JessYanCoding 评论0 收藏0
  • 作用域与闭包的学习

    摘要:闭包,一言以蔽之,就是函数和作用域链,通俗点就是函数内部使用了外面定义的变量。内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境的任何变量或函数。 闭包,一言以蔽之,就是函数和作用域链,通俗点就是函数内部使用了外面定义的变量。我们从一个例子说起: function foo(){ var a = 2; var b = 3; return fun...

    caige 评论0 收藏0
  • 深入理解 JavaScript, 从作用域与作用域链开始

    摘要:所以上面那段代码链中最初应该是之后之后所以最后的输出结果是作用域链概念看了前面一个完整的函数执行过程,让我们来说下作用域链的概念吧。而这一条形成的链就是中的作用域链。 showImg(https://segmentfault.com/img/bVbvayE?w=1280&h=545); 1. 什么是作用域 作用域是你的代码在运行时,某些特定部分中的变量,函数和对象的可访问性。换句话说,...

    frontoldman 评论0 收藏0

发表评论

0条评论

Invoker

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<