我有一些像这样的JavaScript:
<script>
var num = 0;
if(num==0){
function lol(){
alert("lol");
}
} else {
function lol(){
alert("haha");
}
}
</script>
然后,在我的页面后面:
<script>lol();</script>
如何确保else语句中第二个函数不会被第二个函数覆盖?
由于
答案 0 :(得分:3)
没有答案在那里提供了对您问题的正确描述。所以我会尽我所能。你遇到的问题是,function declarations
(你在那里得到的)是其他一些东西,在javascript运行时解释。此效果通常称为hoisting
,这意味着这些函数确实移动到当前上下文的顶部以供脚本执行。
示例,在您的代码段中,会发生以下情况:
<script>
var num = 0;
function lol(){
alert("lol");
}
function lol(){
alert("haha");
}
if(num==0) {
} else {
}
</script>
因此,在这个特定实例中的一个简单的解决方案是,不是使用函数声明而是使用function expression
。我们可以强制我们的引擎以多种方式创建FE,例如我们可以像
var num = 0,
lol;
if( num === 0 ) {
lol = function() {
alert('lol');
};
}
else {
lol = function() {
alert('haha');
};
}
函数表达式不会被提升到当前上下文的顶部,因为它不是由js引擎“预先评估”的。所以上面的代码就可以了。
答案 1 :(得分:1)
如果要有条件地定义函数,请使用函数表达式以避免提升行为:
var myFunction = someCondition
? function() {
alert('foo');
}
: function() {
alert('bar');
};
myFunction();
答案 2 :(得分:1)
这里有其他答案有更多的代码,但我想如果你不知道为什么它不总是被覆盖,你最好的选择是理解问题的根源。
此处提供了对不同函数声明和深入外观的非常详尽的比较:http://kangax.github.com/nfe/
这是一篇很长的文章,肯定会花一些时间阅读,但我认为你和每个人都能更好地理解这个问题的根源。从长远来看,它至少可以节省大量时间,而不仅仅是复制粘贴代码。
阅读完文章后,您将知道为什么它不会一直被覆盖。
如果您不想阅读,请输入以下代码:
<script>
var num = 0;
var lol = function(){
alert("haha");
};
if(num==0){
lol = function(){
alert("lol");
};
}
</script>
答案 3 :(得分:0)
<script>
var num = 0;
if(num==0){
var lol = function(){
alert("lol");
}
} else {
var lol = function(){
alert("haha");
}
}
</script>
答案 4 :(得分:0)
怎么样:
if(num == 0) {
lol = function() {
alert("lol");
};
}
else {
lol = function() {
alert("haha");
};
}
答案 5 :(得分:0)
为什么不稍微重新构建代码:
<script>
var num = 0;
function lol(){
if(num==0){
alert("lol");
} else {
alert("haha");
}
}
</script>