关于函数声明和函数表达式的一点疑问?

直接上代码

    var  a=1;
    var f=function(){
        a=2;
    };
    f();
    alert(a);
    function f(){
        a=3;
    }
    f();
    alert(a);

请问大家,上面的alert 依次弹出什么? 为什么?

阅读 3.1k
3 个回答

两次都是2.
重点:函数声明最先被执行(不是执行内部代码,是方法名被记录下来),然后按照顺利执行函数里面的其他部分。
所以,这段代码的执行顺序是:

  1. function f(){} (将f这个函数名记录下来)

  2. var f=function(){} (执行函数表达式,变量f被赋值)

  3. f(); alert(a); (执行函数f,输出2)

  4. f(); alert(a);执行函数f,输出2)

代码顺序相当于:

function f(){
    a=3;
}
var  a=1;
var f=function(){
    a=2;
};
f();
alert(a);

f();
alert(a);

全部是两个2,这个主要的问题还是在函数声明提前上,执行上下文中进行了函数的声明,但是到了下面这个函数被覆盖了,也就是说在执行代码前,我们已经对函数进行了声明,到了下面的var f=function(){a=2;};只是更改了函数的值

var  a=1;
alert(a);//1
var f=function(){
    a=2;
};
alert(a);//1
f();
alert(a);//2
function f(){
    a=3;
}
alert(a);//2
f();
alert(a);//2
f=function(){
  a = 5;
};
alert(a);//2
f();
alert(a);//5

看了你的问题,我又验证了下上面代码。分析其原因:函数声明和变量声明会提前到代码的最顶端,变量赋值却是在其本来的位置。所以,上面代码等同于:

var a;
var f;
function f(){
  a = 3;
}
a=1;
alert(a);//1
f=function(){
    a=2;
};
alert(a);//1
f();
alert(a);//2
alert(a);//2
f();
alert(a);//2
f=function(){
  a = 5;
};
alert(a);//2
f();
alert(a);//5
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题