以下代码中的输出如何变为1可以解释一下吗?
var foo = 1;
function bar() {
foo = 10;
return;
function foo() {}
}
bar();
alert(foo);
答案 0 :(得分:1)
您已经定义了一个具有相同名称foo
的函数,因此在方法foo
内(充当局部变量)引用函数。您可以在console.log(foo)
方法中看到bar()
作为函数。
var foo = 1;
function bar() {
console.log(foo);
foo = 10;
return;
function foo() {}
}
var b=bar();
alert(foo);
您可以做的是在全局上下文中获取变量(window['foo']
)并更新或重命名变量或函数。
var foo = 1;
function bar() {
window['foo'] = 10;
return;
function foo() {}
}
var b=bar();
alert(foo);
答案 1 :(得分:0)
Var hoisting 是根据Mozilla Developer Network as mention here...
在java脚本中使用的一种技术其中说..
因为在执行任何代码之前处理变量声明(和一般声明),所以在代码中的任何地方声明变量等同于在顶部声明它。这也意味着变量可以在声明之前使用。此行为称为“提升”,因为看起来变量声明被移动到函数或全局代码的顶部。
所以当你宣布function foo() {}
时
在function bar() {...}
内,它被视为局部变量,因此它的值在bar()之外被销毁。
下面是产生相同行为的代码:
var foo = 1;
function bar() {
foo = 10;
return;
var foo;
}
bar();
alert(foo);
你的代码只是将变量foo声明为方法。
答案 2 :(得分:0)
请参阅console.log:
var foo = 1;
function bar() {
console.log(foo)//function foo() {}
foo = 10;
console.log(foo)//10
return;
function foo() {}
}
bar();
alert(foo);

JavaScript解释器始终将函数声明和函数变量移动('hoisted')到JavaScript范围的顶部。
所以它更像这样:
var foo = 1;
function bar() {
function foo() {}
console.log(foo);
foo = 10;
return;
//function foo() {}
}
var b=bar();
alert(foo);