知识大全 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

详解Spring中bean的scope  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如何使用s

知识大全 javascript中的parseInt和parseFloat区别

javascript中的parseInt和parseFloat区别  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一

知识大全 JavaScript中的for和iin循环的使用

JavaScript中的for和iin循环的使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 JavaScript面试-介绍一下JavaScript中的对象

JavaScript面试-介绍一下JavaScript中的对象  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来

知识大全 JavaScript中的数组创建

JavaScript中的数组创建  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  使用New创建数

知识大全 理解javaScript中的事件驱动

理解javaScript中的事件驱动  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishixin

知识大全 去除JavaScript中的if 办法

去除JavaScript中的if办法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Email:

知识大全 辨析JavaScript中的词、句和段

辨析JavaScript中的词、句和段  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  正确辨析J

知识大全 ASP.NET中的javascript操作

ASP.NET中的javascript操作  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  下面总

知识大全 JavaScript中的数组、集合及效率

JavaScript中的数组、集合及效率  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  数组是J