Javascript中的变量范围(提升)
我的一个朋友正在参加一个在线测验,他问了我一个我无法回答的问题Javascript中的变量范围(提升),javascript,global-variables,scope,Javascript,Global Variables,Scope,我的一个朋友正在参加一个在线测验,他问了我一个我无法回答的问题 var global = false; function test() { global = true; return false; function global() {} } console.log(global); // says false (As expected) test(); console.log(global); // says false (Unexpected: should be true)
var global = false;
function test() {
global = true;
return false;
function global() {}
}
console.log(global); // says false (As expected)
test();
console.log(global); // says false (Unexpected: should be true)
如果我们假设函数与var变量一起挂在顶部,那么让我们试试这个
var foo = 1;
function bar() {
return foo;
foo = 10;
function foo() {}
var foo = 11;
}
bar();
console.log(foo); //says 1 (But should be 11) Why 1 this time ??
这是一个可以玩的游戏
PS:如果我们从
test()
中删除function global(){}
,那么它运行良好。有人能帮我理解为什么会发生这种情况吗?var
语句和函数声明语句被“提升”到其封闭范围的顶部。因此,函数中的
function global(){}
会创建一个本地global
名称
在函数中分配给global
将绑定到此本地名称。以下是如何使用提升“重写”它,以了解编译器是如何看待它的:
function test() {
var global = function() {}; // hoisted; 'global' now local
global = true;
return false;
}
我会回答你问题的第二部分 如果我们假设函数与var变量一起被提升到顶部
bar();
console.log(foo); //says 1 (But should be 11) Why 1 this time ??
您应该尝试console.log(bar());console.log(foo)代码>取而代之。然而,提升对您的功能的影响是:
function bar() {
var foo;
function foo() {}
return foo;
foo = 10;
foo = 11;
}
因此,您应该期望返回函数,因为变量赋值在return
语句之后。而var
和函数声明都使foo
成为局部变量,因此全局foo=1
永远不会改变;这就是吊装的意思。不,不应该。按照OP所写的方式分配的函数,将始终按照答案所说的那样被提升。@^这就是我所想的。@几年前,这篇文章让我大开眼界,我只是想与大家分享;)我没有在编辑中添加答案,因为@SLaks的答案仍然适用var foo=11
在该函数的本地范围内foo=10
被忽略,function foo()
仍在创建一个局部作用域变量foo,并且var foo
bar()返回function@DavidBarker是的,我现在明白了。感谢您为Slak的答案添加的漂亮插件。请注意,函数中的global
变量实际上是本地变量……您也可以通过Chrome开发工具逐步完成此过程。感谢您的解释+我现在明白了。沃德的那篇文章真的帮了我的忙。我不知道JS world+1中是否存在起重这样的东西