知识大全 JavaScript中的[[scope]]和Scope Chain
Posted 函数
篇首语:没有风暴,船帆只不过是一块破布。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 JavaScript中的[[scope]]和Scope Chain相关的知识,希望对你有一定的参考价值。
JavaScript中的[[scope]]和Scope Chain 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
ECMA 中规定JS使用Scope Chain来实现closure Scope Chain是JS中非常重要的机制 JS中所有的标识符(Identifier)都是通过Scope Chain来查找值的 下面的部分是关于ECMA 及其实现SpiderMonkey和JScript如何用Scope Chain和[[scope]]来实现closure的
变量标识符查找
当我们在JS程序里写下像a++这样的表达式时 很难想象a的值和内存地址经过了复杂的查找过程才得以确定 JS的所有标识符(通常是我们自己定义的变量名)在执行时都是从Scope Chain中查找值的 这也是导致JS执行速度低的原因和JS实现灵活的动态特性的基础 Scope Chain是一个链表 在JS执行时 总是维护着Scope Chain来保证变量的可访问性或者不可访问性 对于这个过程ECMA 给出了很明确的描述(我翻译了一下 各位将就著看)
获取Scope Chain的下一个对象 如果没有对象了 则转到第 步
调用结果( )的[[HasProperty]]方法 传递Identifier作为参数
如果结果( )是true Reference(引用)类型的值 它的base object是结果( )而它的
property name是Identifier
跳到第 步
返回一个Reference类型 它的base object是null它的property name 是Identifier
注 Reference(引用)类型的值是JS引擎使用的一种数据类型 它分为base object和property name两个部分 假设在JS代码中有obj prop这样的表达式 那么解释成Reference类型 base object是对象obj 而property name是字符串 prop
Scope Chain开始时被设为宿主对象 所以在全局代码中的变量就是宿主对象的属性 Scope Chain在执行时由JS引擎自动维护 编译型的引擎也会创建相应的运行时环境来做此事 Scope Chain一般在函数调用或者执行进入with块的时候改变
函数的执行
JS函数执行并非简单地执行函数体(Function Body)中的JS代码 在此之前JS引擎会创建一个Activation Object 这个对象将会被作为Scope Chain的顶端 而函数的[[scope]]属性中的对象将被链接为其后续的对象 ([[scope]]在函数定义时被确定 稍后的内容是关于[[scope]]如何定义的 )这意味着Function Body中的JS代码所使用的标识符都是按照上一部分所描述的 最先从Activation Object开始查找的 Activation Object创建时只有一个arguments属性 它不会继承Object prototype的属性和方法 接下来的变量初始化(Variable Instantiation)将函数体中变量和函数声明的结果添加到Activation Object作为属性
函数的[[scope]]属性
[[scope]]是ECMA 规定的对象的私有属性 理论上只有JS引擎可以访问 但FireFox的几个引擎(SpiderMonkey和Rhino)提供了私有属性__parent__来访问它(所以一会我们可以看一看它) 尽管所有对象都有[[Scope]]但是它只对函数对象有用
对于函数声明和匿名函数表达式来说 [[scope]]就是它创建时的Scope Chain 但是对于有名字的函数表达式 [[scope]]顶端是一个新的JS对象(也就是继承了Object prototype) 这个对象被链到函数创建时的Scope Chain 它本身有一个属性就是函数的名字 这确保了函数内部的代码可以无误地访问自己的函数名进行递归
举个例子
function f () return n> ?n*f (n ): ;
var f =function f() return n> ?n*f(n ): ;
cha138/Article/program/net/201311/13723相关参考
详解Spring中bean的scope 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 如何使用s
知识大全 javascript中的parseInt和parseFloat区别
javascript中的parseInt和parseFloat区别 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一
JavaScript中的for和iin循环的使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 JavaScript面试-介绍一下JavaScript中的对象
JavaScript面试-介绍一下JavaScript中的对象 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来
JavaScript中的数组创建 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 使用New创建数
理解javaScript中的事件驱动 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishixin
去除JavaScript中的if办法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Email:
辨析JavaScript中的词、句和段 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 正确辨析J
ASP.NET中的javascript操作 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 下面总
JavaScript中的数组、集合及效率 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 数组是J