WEB开发网
开发学院网页设计JavaScript Javascript 闭包 阅读

Javascript 闭包

 2010-09-14 13:29:59 来源:WEB开发网   
核心提示: function exampleOuterFunction(formalParameter){function exampleInnerFuncitonDec(){... // 内部函数体代码}...// 其余的外部函数体代码}exampleOuterFunction( 5 );与外部函数

function exampleOuterFunction(formalParameter){
  function exampleInnerFuncitonDec(){
    ... // 内部函数体代码
  }
  ... // 其余的外部函数体代码
}
exampleOuterFunction( 5 );

与外部函数声明对应的函数对象会在全局执行环境的变量实例化过程中被创建。因此,外部函数对象的 [[scope]] 属性中会包含一个只有全局对象的“单项目”作用域链。

当在全局执行环境中调用 exampleOuterFunction 函数时,会为该函数调用创建一个新的执行环境和一个活动(可变)对象。这个新执行环境的作用域就由新的活动对象后跟外部函数对象的 [[scope]] 属性所引用的作用域链(只有全局对象)构成。在新执行环境的变量实例化过程中,会创建一个与内部函数声明对应的函数对象,而同时会给这个函数对象的 [[scope]] 属性指定创建该函数对象的执行环境(即新执行环境。译者注)的作用域值--即一个包含活动对象后跟全局对象的作用域链。

到目前为止,所有过程都是自动、或者由源代码的结构所控制的。但我们发现,执行环境的作用域链定义了执行环境所创建的函数对象的 [[scope]] 属性,而函数对象的 [[scope]] 属性则定义了它的执行环境的作用域(包括相应的活动对象)。不过,ECMAScript 也提供了用于修改作用域链 with 语句。

with 语句会计算一个表达式,如果该表达式是一个对象,那么就将这个对象添加到当前执行环境的作用域链中(在活动<可变>对象之前)。然后,执行 with 语句(它自身也可能是一个语句块)中的其他语句。之后,又恢复到调用它之前的执行环境的作用域链中。

with 语句不会影响在变量实例化过程中根据函数声明创建函数对象。但是,可以在一个 with 语句内部对函数表达式求值:-

上一页  4 5 6 7 8 9 10  下一页

Tags:Javascript 闭包

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接