在javascript中声明函数时,我遇到了这种奇怪的行为。我无法理解原因。任何人都可以解释。
if ( true ) {
function myFun() {
alert( "true block" );
}
} else {
function myFun() {
alert( "false block" );
}
}
myFun();
它显示出假阻止的警告!!!
答案 0 :(得分:3)
了解javascript hoisting
变量声明和函数声明在javascript中被提升到当前作用域的开头。
可以更好地理解这一点
/*hoisting will make the definitions look like this*/
function myfunc() { x = 10; } <------
|
function myfunc() { x = 20; } <-----|----
| |
if(true){ | |
function myfunc() {x = 10;} ------- |
} |
else{ |
function myfunc() {x = 20;} -----------
}
myfunc();
alert(x);
警报将始终触发20.因为第二个定义会覆盖第一个。
答案 1 :(得分:0)
这是因为myFun
功能已悬挂。你应该永远在if语句中声明这样的函数。检查函数中的某个变量是否为true
,而不是。
答案 2 :(得分:0)
Javascript中没有块级范围。在if块中声明的所有变量实际上都是悬挂的。
因此,当你编写if else时,实际的函数变量myFun
被覆盖在else块中并被提升。
答案 3 :(得分:0)
在作用域和提升过程中,你的函数myFun被覆盖,所以要避免这种行为试试这个
var myFun;
if ( true ) {
myFun= function(){
alert( "true block" );
}
} else {
myFun = function() {
alert( "false block" );
}
}
myFun();
答案 4 :(得分:0)
如果您想动态分配myFun,请使用以下语法
if (true) {
myFun=function(){alert('true');}
}else{
myFun=function(){alert('false');}
}
myFun();
因为如果你使用的是function MyFun()
声明样式,那么函数是在解析时定义的,而不是像你想要的那样运行。