JavaScript“悬挂”
我遇到了JavaScript'提升',我没有弄清楚这段代码是如何运作的:
var a = 1; function b() { a = 10; return; function a() {} } b(); alert(a);
我知道函数声明( function a() {}
)将被提升到函数b
作用域的顶部,但它不应该覆盖a的值(因为函数声明覆盖variables声明而不是variables初始化),所以我预计警报的价值将是10而不是1!
- 全局
a
设置为1
-
b()
被调用 -
function a() {}
被挂起,并创build一个局部variablesa
来掩盖全局a
- 本地
a
被设置为10
(覆盖函数a
) - 全球
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
- 函数声明
function a(){}
首先被挂起,因此在本地作用域中被创build。 - 如果你有两个名字相同的variables(一个在局部全局variables中),局部variables总是优先于全局variables。
- 当你设置
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();
希望这可以帮助