3

好的,这是一些代码

function myFunc(){
   var myvar = 8;
       function myFunc2(num){
           alert(myvar+num);
       }

   myFunc2(2);

}

myFunc();

我想清除我的想法,所以如果我错了请纠正我

我已经阅读了堆栈溢出中的大量文章,但我想知道我理解它还是应该阅读更多。

据我了解,幕后发生的事情是in global execution context there it creates function object with the namemyFunc` 及其 [[scope]] 属性分配给全局变量对象。

当我调用myFunc它时,它会创建自己的执行上下文和激活对象,其中所有函数的参数和函数声明在任何逐行代码执行之前初始化。

当创建内部函数对象时,它的内部 [[scope]] 属性被分配了其外部执行上下文的变量对象 + 全局变量对象的值,因此每个函数都创建自己的执行上下文,但在此之前每个函数的内部 [[scope]] 属性是首先分配。

我已经阅读了堆栈溢出中的大量文章,但我想知道我理解它还是应该阅读更多。

4

1 回答 1

1

以下是基于我对规范的理解以及您的解释听起来不清楚的几点建议:

  • ECMAScript 3 中使用了术语“激活对象”,但在当前版本的规范中不再使用。ES5 使用术语“词法环境”来表示由“环境记录”值组成的类型(内部类型),并且可能是对外部词法环境的引用。

  • 由于这个对外部词法环境的引用,作用域可以被认为是一个链。因此,通过该链访问外部范围(包括全局范围)。(当您说“[[scope]] 属性被分配了其外部执行上下文的变量对象 + 全局变量对象的值”时,听起来这两条记录都被复制到了当前函数的词法环境中,但事实并非如此。 )

希望这可以帮助!

于 2013-10-04T14:59:15.723 回答