简述JavaScript的scope机理

2016-02-20 00:56 6 1 收藏

今天图老师小编给大家展示的是简述JavaScript的scope机理,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!

【 tulaoshi.com - Web开发 】

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)这个第一篇中间的内容讲得大体都是对的,但是还是搞得太复杂。倒是头尾两句话非常具有典型意义:
引用什么叫闭包?我花了很长时间来弄明白这个概念,但每次以为弄明白的时候,却又会发现其实没搞清楚。
引用这究竟是为什么,我目前还不清楚。但据说ECMA262标准给出了具体的实现方法的我没体力看了,交给大家吧。

暂时没有时间详细解说这些内容,仅把在小麦文章后面的comments记录此处。


closure还是比较容易理解的,无非是内部函数可以访问外部的变量。之所以能比较容易的支持closure,也在于JS是使用垃圾回收的,因此不存在函数局部变量生存期的问题被回收的只是局部变量符号,真正所引用的对象只要还有任何一个地方引用它无论是直接引用还是像closure那样间接引用,都不会被回收。当然,closure的间接引用也加剧了IE中内存泄露问题,此乃题外话,不赘述。

closure(闭包)、scope chain(作用域链)、lexical scope(词法作用域),三者当然不是一个概念,但是确实是有紧密联系的。具体来说,JS语言是以scope chain的方式来实现lex scope和closure的。所以就算搞不懂scope chain,也不妨碍你使用JS。

1. scope chain是一种实现手段,具体来说,它是一种name lookup的检索机制。

2. lexical scope是一种作用域机制,它很好理解。因为lex scope取决于源代码,所以通常编译器可以进行静态分析来确定每个标识符实际的引用。实际上lexical scope因此也称为static scope。

3. 其实JS并非完全的lexical scope。因为有with和eval这两个特例。所以说JS是lexical scope实际上是说它的scope机制非常接近于lexical scope。

4. 因此JS引擎通常不使用静态分析,而且只使用静态分析是无法实现with的语义的!JS使用类似dynamic scope的技术,区别在于通常dynamic scope的bindings堆栈是全局的,而JS为每个execution context都单独设置一个bindings堆栈,也就是所谓的scope chain。

5. 结论:可以把JS的scope看做一个用scope chain机制实现的近似lexical scope。


Updates:
关于with/eval对于lexical scope的影响,可以看这位用scheme实现JS引擎的同志的说法:
引用...But the real subtlety comes in with the with (dynamically add a computed object value to the runtime environment as a new environment frame) and eval constructs...
... So outside of a with, you get normal, efficient lexical scope; inside a with, you get stupid, slow, dynamic scope...

来源:https://www.tulaoshi.com/n/20160220/1632865.html

延伸阅读
美白润肤 1 三七粉加蜂蜜能够帮助美白润肤。 三七粉能够活血,有效加快身体的血液循环,再配合蜂蜜,能够帮助滋润肌肤,让肌肤呈现出自然美白、滋润有弹性的状态。 抗皱养颜 2 三七粉加蜂蜜能够帮助抗皱美颜。 三七粉能够帮助加快血液循环,改善肌肤的营养状况,经常使用能够让肌肤恢复红润光泽,搭配蜂蜜能够有效舒缓肌肤皱纹,延缓衰老...
标签: 生活常识
慢严舒柠的作用机理是什么 慢严舒柠的作用机理是什么 首先:慢严舒柠清喉利咽颗粒用于急慢性咽炎、咽喉发干、声音嘶哑等病症。慢性咽炎系中医喉痹范畴,主要由肺、脾、肾等脏腑功能失调所致。以往多阴虚论治,而对其他兼证顾及不够。 其次:在临床中观察到,慢性咽炎虽局部病变,但与全身情况关系密切。多数病人除阴虚表现外,还有体...
标签: Web开发
虽然 JavaScript 与Java有紧密的联系,但却是两个公司开发的不同的两个产品。Java是SUN公司推出的新一代面向对象的程序设计语言,特别适合于Internet应用程序开发;而JavaScript是Netscape公司的产品,其目的是为了扩展Netscape Navigator功能,而开发的一种可以嵌入Web页面中的基于对象和事件驱动的解释性语言,它的前身是Live Script;而Ja...
标签: Web开发
上次写的一篇《JavaScript 数组的 uniq 方法》,发现代码的问题还是存在。比如如果数组内有 undefined 元素就无法过滤等。 昨天看见 Lazy 兄弟重新更新了函数,现在他是这样子写的: Array.prototype.uniq = function() {     var resultArr = [], ...
标签: Web开发
JavaScript 是一种基于对象(Object)和事件驱动(Event Driven)并具有安全性能的脚本语言。使用它的目的是与HTML超文本标记语言、Java 脚本语言(Java小程序)一起实现在一个Web页面中链接多个对象,与Web客户交互作用。从而可以开发客户端的应用程序等。它是通过嵌入或调入在标准的HTML语言中实现的。它的出现弥补了HTML语言的缺陷,它是Java...

经验教程

154

收藏

61
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部