我偶然发现了JavaScript‘提升’,我不知道这段代码到底是如何工作的:
var a = 1;
function b() {
a = 10;
return;
function a() {}
}
b();
alert(a);我知道像( function a() {} )这样的函数声明将被提升到函数b作用域的顶部,但它不应该覆盖a的值(因为函数声明覆盖了变量声明,而不是变量初始化),所以我预计警报的值应该是10而不是1!
发布于 2013-03-09 21:26:06
全局代码设置为1
b() is called
function a() {}被提升并创建一个屏蔽全局a
a设置为a (覆盖函数a)
a(a) is a <
发布于 2013-03-09 21:35:05
这是因为本例中编译/解释的顺序有些误导。在执行函数的其余部分之前,会先解释function a () {}行,因此在函数的开头,a的值为function a () {}。当您将其重新分配给10时,您将在函数b()的局部作用域中重新分配a的值,返回后将丢弃该值,而将a = 1的原始值保留在全局作用域中。
您可以通过将alert()等放在适当的位置来验证这一点,以查看a在各个点的值是什么。
发布于 2013-03-10 00:40:12
(1) JavaScript没有block语句作用域;相反,它是块所在代码的本地作用域。(2) Javascript在函数作用域中声明变量,这意味着在函数中声明的变量在该函数中的任何地方都可用,甚至在它们被赋值之前。
(3)在函数体中,局部变量优先于同名的全局变量。如果您声明了一个与全局变量同名的局部变量或函数参数,则将有效地隐藏全局变量。
你的代码与:(阅读评论)
<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)
(2)
(3)
所以在你的代码中:
var a = 1; //global a = 1
function b() {
a = 10;
return;
function a() {} //local
}
b();
alert(a); //global a = 1 https://stackoverflow.com/questions/15311158
复制相似问题