以下是我遇到的代码:
var foo=1;
function bar(){
foo=10;
return;
function foo(){}
}
bar();
alert(foo);
结果是1!
只是不知道为什么。
据我所知,第一行为窗口对象定义了一个全局变量'foo',值为1,然后在bar函数中赋予foo 10,因为在foo之前没有'var',所以全局变量'foo'将被赋值为10.然后返回,该函数的其余部分将不会被执行。
但它警告1。
在bar函数中删除函数foo定义时,它会发出警报10.
答案 0 :(得分:3)
欢迎来到javascript悬挂的神秘世界:)阅读这篇文章,你将受到启发:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html
作为一个简短的回答:使用这样的javascript工作:
hello();
function hello() {
alert('hello');
}
Javascript首先将所有函数声明移到代码的顶部,这样就可以在“定义之前”调用任何函数。我相信如果存在函数声明,foo
不会更改为10的原因是因为它的行为类似于var foo;
。您正在本地定义一个函数,因此当它运行foo = 10;
时,您只需用值function foo()
覆盖本地定义的10
。
答案 1 :(得分:1)
返回1的原因是因为foo=10
位于function bar()
所以foo=10
是一个局部变量,你必须调用它的函数来改变foo变量
例如,如果你这样做,它会提醒10
var foo=1;
function bar(){
foo=10;
return;
alert(foo);
}
bar();