JavaScript“悬挂”

我遇到了JavaScript'提升',我没有弄清楚这段代码是如何运作的:

var a = 1; function b() { a = 10; return; function a() {} } b(); alert(a); 

我知道函数声明( function a() {} )将被提升到函数b作用域的顶部,但它不应该覆盖a的值(因为函数声明覆盖variables声明而不是variables初始化),所以我预计警报的价值将是10而不是1!

  1. 全局a设置为1
  2. b()被调用
  3. function a() {}被挂起,并创build一个局部variablesa来掩盖全局a
  4. 本地a被设置为10 (覆盖函数a
  5. 全球a (仍然是1 )被警告

这是因为这个例子中编译/解释的顺序有些误导。 function a () {}行在函数的其余部分被执行之前被解释,所以在函数的最开始, a具有function a () {} 。 当您将其重新分配给10 ,您将重新分配函数b()的局部作用域中的b()的值,然后在返回时将其丢弃,并在全局作用域中保留a = 1的原始值。

您可以通过将alert()等放置在适当的位置来validation这一点,以查看a在不同点上的值。

(1)JavaScript没有块语句范围; 相反,它将位于块所在的代码本地。

(2)Javascript在函数范围内声明variables,这意味着函数中声明的variables在函数中的任何地方都是可用的,甚至在它们被分配一个值之前

(3)在函数的主体中,局部variables优先于具有相同名称的全局variables。 如果声明与全局variables同名的局部variables或函数参数,则可以有效地隐藏全局variables

你的代码是一样的:( 阅读评论

 <script> var a = 1; //global a = 1 function b() { a = 10; var a = 20; //local a = 20 } b(); alert(a); //global a = 1 </script> 

参考:
(1) JavaScriptvariables范围:
(2) Javascript吊装的一个危险的例子
(3) 可变范围

所以在你的代码中:

 var a = 1; //global a = 1 function b() { a = 10; return; function a() {} //local } b(); alert(a); //global a = 1 
  1. 函数声明function a(){}首先被挂起,因此在本地作用域中被创build。
  2. 如果你有两个名字相同的variables(一个在局部全局variables中),局部variables总是优先于全局variables。
  3. 当你设置a=10 ,你设置的是局部variablesa ,而不是全局variables。

因此,全球variables的价值保持不变,你得到,提醒1

当我阅读同样的文章时,你做了JavaScript范围和提升 ,我也很困惑,因为作者从来没有在编译器中展示两个开放的示例代码。

以下是您提供的示例,以及页面上的第二个示例:

 var a = 1; function b() { function a() {} // declares 'a' as a function, which is always local a = 10; return; } b(); alert(a); 

这是网页上的第一个例子:

 var foo = 1; function bar() { var foo; // a new local 'foo' variable if (!foo) { foo = 10; } alert(foo); } bar(); 

希望这可以帮助