这里有一些奇怪的代码...
var x = 5;
function fn() {
x = 10;
return;
function x() {}
}
fn();
alert(x);
这是jsFiddle
function x() {}
之后是否return
被调用了?
为什么不提醒10?
答案 0 :(得分:10)
function x() {}
hoisted位于fn
范围的开头,这有效地使x
成为评估x = 10;
之前的局部变量。
该函数不设置为 10
。
更新:上面的句子错了。 x
实际设置为10
。 var
不用于声明它,但即使它是,下面引用中的最后一句只引用名称x
的声明部分,而不是它的< em>分配到10
。
来自MDN(强调我的):
<强>功能强>
具有不同范围行为的三种形式:
- 的声明强>: 作为父级函数顶级的声明
- 的行为类似于初始化为该函数的var绑定
- 初始化“提升”到父函数的最顶层,高于vars
<强> VAR 强>
- 功能范围
- 提升到其功能的顶部
- 同一范围内同名的重新声明是无操作
答案 1 :(得分:3)
函数x浮动到顶部,因此您将函数指定为10
答案 2 :(得分:2)
你在fn中声明函数x;因此,您使用的是本地范围的x版本。声明函数x的关键点无关紧要。将x设置为10时实际执行的操作是将x的函数设置为10。
答案 3 :(得分:2)
This code也提醒5:
var x = 5;
function fn() {
x = 10;
return;
var x;
}
fn();
alert(x);
重要的是,您要声明本地变量 x
。在返回语句之后声明变量也无关紧要 - 它仍然是一个局部变量。
删除声明,而你得到10,因为x
不再是局部变量。
答案 4 :(得分:1)
这是由变量提升在JavaScript中的工作方式引起的。变量声明被提升但不是他们的受让人。函数声明也与函数体一起提升(尽管函数表达式不是)。
所以你的代码实际上是这样做的:
var x = 5;
function fn() {
var x;
x = function () {}
x = 10;
return;
}
fn();
alert(x);
因此,函数中的x
仅使用局部范围声明,并且不会影响主代码中的x
decalred。
答案 5 :(得分:0)
这是因为fn
是一个对象,x
是该对象的属性。局部范围总是会对全局变量产生影响。
答案 6 :(得分:0)
fn()中的X是一个函数 但是全局范围内的x是var
删除函数x(){}部分,x将被警告10