摘要:闭包,一言以蔽之,就是函数和作用域链,通俗点就是函数内部使用了外面定义的变量。内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境的任何变量或函数。
闭包,一言以蔽之,就是函数和作用域链,通俗点就是函数内部使用了外面定义的变量。
我们从一个例子说起:
function foo(){ var a = 2; var b = 3; return function bar(){ console.log(a+b); } } var baz = foo(); baz();
最后的结果,控制台会输出a+b的值,也就是5。
在这段代码里,出现了闭包,bar()就是函数,bar引用了外面定义的变量a和b。
那么作用域链又是什么呢?
来个官方解释:(红宝书)
当代码在一个环境中执行时,会创建变量对象的一个作用域链。它的作用是保证对执行环境有权访问的所有变量和函数的有序访问。它的前端始终都是当前执行代码所在环境的变量对象。
这些东西看起来好像很难理解。我们先从执行环境这个概念开始解释。
执行环境(有时也称作环境)定义了变量或函数有权访问的其他数据,决定了它们各自的行为。
比如说上面的例子中,共有三个执行环境:
全局环境,有一个函数foo和一个变量baz。
foo的局部环境,有两个变量a和b和一个函数bar。
bar的局部环境。
bar的局部环境中,没有变量,但是它可以访问foo的局部环境中的变量a和b。
但是在全局环境中不能直接访问foo的局部环境中的变量a和b。因为全局环境是foo局部环境的父执行环境。
最后我们再来看作用域链
下图可以形象地表示上面例子的作用域链
图中的矩形表示特定的执行环境。内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境的任何变量或函数。这些环境之间是有次序的。每个环境可以向外搜索,但反之不行。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/93563.html
摘要:而闭包却能阻止这件事情发生。由于的声明位置使它拥有涵盖内部作用域的闭包,使得该作用域能够一直存在,以供在之后进行引用。到这里,小菊花课堂之闭包的内容就告一段落啦,感谢各位能耐心看到这里。 由于前段时间项目没有那么忙,然后我这人一天不看点啥就非常焦虑,于是二刷《你不知道的JavaScript》,现在读到闭包,想着看完这一章节,写点东西也是挺好的,所以有了下面的内容,如有不对的地方,敬请斧...
摘要:闭包里面保存的变量只有被方法引用了的变量这个例子里,闭包里只有并没有。那最后来说说的问题闭包到底是什么闭包是一个作用域。鉴于在的调试窗口,是放在下面的那闭包这个作用域是个什么范围被后代方法子方法,孙子方法。。。 首先给js的作用域这个话题打标签:2,var, 全局变量,局部变量,函数,undefined, 作用域提升,赋值不会提升,ReferenceError, 同名覆盖。打完标签之后...
摘要:之前一篇文章我们详细说明了变量对象,而这里,我们将详细说明作用域链。而的作用域链,则同时包含了这三个变量对象,所以的执行上下文可如下表示。下图展示了闭包的作用域链。其中为当前的函数调用栈,为当前正在被执行的函数的作用域链,为当前的局部变量。 showImg(https://segmentfault.com/img/remote/1460000008329355);初学JavaScrip...
摘要:的变量作用域是基于其特有的作用域链的。需要注意的是,用创建的函数,其作用域指向全局作用域。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。 作用域 定义 在编程语言中,作用域控制着变量与参数的可见性及生命周期,它能减少名称冲突,而且提供了自动内存管理 --javascript 语言精粹 我理解的是,一个变量、函数或者成员可以在代码中访问到的范围。 js的变量作...
阅读 3063·2021-11-22 09:34
阅读 557·2021-11-22 09:34
阅读 2409·2021-10-08 10:18
阅读 3333·2021-09-22 15:57
阅读 2561·2021-09-22 15:25
阅读 2348·2019-08-30 15:54
阅读 2040·2019-08-30 15:44
阅读 1776·2019-08-29 11:18