2013-10-04 57 views
1

确定这是一些代码javascript函数对象的[[scope]]属性?

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 name myFunc`和它的[[scope]]属性被分配给全局变量对象。

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

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

我已经阅读堆栈溢出文章的分配已经,但我想知道我理解得很好,或者我应该阅读更多。

+0

您是否问变量提升是否会干扰闭包的工作?不,它不能。 – bfavaretto

+0

我想知道我的解释是正确的?我知道如何关闭工作 –

+0

这听起来像你理解它,但有些东西还不清楚。我只是不确定*什么*。 – bfavaretto

回答

1

这里有几个基于我对规范的理解指针,以及基于什么声音在你的解释不清楚:

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

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

希望这有助于!

+0

谢谢!我正在阅读High Performance JS(©2010),然后是JS忍者秘密的第二版(©2016) - 这些ES3术语在后者中消失了,我不知道为什么。谢谢! –

相关问题