为什么这个警报5?

时间:2012-09-07 19:48:44

标签: javascript

这里有一些奇怪的代码...

var x = 5;

function fn() {
    x = 10;
    return;
    function x() {}
}
fn();
alert(x);

这是jsFiddle

function x() {}之后是否return被调用了? 为什么不提醒10?

7 个答案:

答案 0 :(得分:10)

function x() {} hoisted位于fn范围的开头,这有效地使x成为评估x = 10;之前的局部变量。

该函数设置为10

更新:上面的句子错了。 x实际设置为10var不用于声明它,但即使它是,下面引用中的最后一句只引用名称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