javascript - 关于函数声明和函数表达式的一点疑问?
大家讲道理
大家讲道理 2017-04-10 16:33:44
[JavaScript讨论组]

直接上代码

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

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

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号