javascript - js函数根据条件定义时出问题
天蓬老师
天蓬老师 2017-04-10 14:45:37
[JavaScript讨论组]

在网上看到这样一段代码

var condition = true;
if(condition){
    function sayHi(){
        alert("Hi!");
    }
} else {
    function sayHi(){
        alert("Yo!");
    }
}
sayHi();

但结果却是yo!
为什么呢?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(3)
怪我咯

function sayHi(){} 这种是函数声明式写法,会声明提前,将它置于最接近的环境中(这里是全局执行环境了)。

而你两次都是同一个函数名,后一个会覆盖前一个。所以你得到的就是 Yo!

你的相当于这样:

    function sayHi(){
        alert("Hi!");
    }
   function sayHi(){
        alert("Yo!");
    }

var condition = true;
if(condition){
} else {
}
sayHi();

是函数被覆盖了

PHPz

没猜错的话这段代码出自于:javascript高级程序设计,因为我也看到这里了。下面摘自书上内容:

关于函数声明,它的一个重要特征就是函数声明提升(function declaration hoisting),意思是在执行代码之前会先读取函数声明。
表面上看,以上代码在conditiontrue时,使用一个sayHi()的定义;否则就使用另一个定义。实际上,这在ECMAScript中属于无效语法,javascript引擎会尝试修正错误,将其转正为合理的状态。但问题是浏览器尝试修正错误的做法不一致。大多数浏览器会返回第二个声明,忽略condition;Firefox会在conditiontrue时返回第一个声明。因此这种使用方式很危险,不应该出现在你的代码中。不过如果使用函数表达式,那就没有问题了。

var sayHi;
var condition = false;
if (condition) {
    sayHi = function () {
        alert('Hi');
    };
} else {
    sayHi = function () {
        alert('Yo');
    };
}
sayHi();    // 执行

纯手打,如果对题主有帮助,很高兴。

阿神

加个日志应该很明显,和if进的分支没有关系,和js加载方法是有关的,function这种方式定义方法的话,js是从上往下加载的,同方法名的话,后面的会覆盖前面的方法,还没运行的时候,第二个sayHi已经把第一个sayHi覆盖了

var condition = true;
alert("33"+condition);
if(condition){
    alert(44);
    function sayHi(){
        alert(11);
        alert("Hi!");
    }
} else {
    function sayHi(){
        alert(22);
        alert("Yo!");
    }
}
sayHi();

换一种函数定义方法,结果就不同了

var condition = true;
alert("33"+condition);
var sayHi;
if(condition){
    alert(44);
    sayHi = function(){
        alert(11);
        alert("Hi!");
    }
} else {
    sayHi = function(){
        alert(22);
        alert("Yo!");
    }
}
sayHi();
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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