Javascript奇怪的if块行为

时间:2015-03-16 07:53:11

标签: javascript function if-statement

在javascript中声明函数时,我遇到了这种奇怪的行为。我无法理解原因。任何人都可以解释。

if ( true ) {
    function myFun() {
        alert( "true block" );
    }
} else {
    function myFun() {
        alert( "false block" );
    }
}
myFun();

它显示出假阻止的警告!!!

5 个答案:

答案 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,而不是。

吊装:http://www.w3schools.com/js/js_hoisting.asp

答案 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()声明样式,那么函数是在解析时定义的,而不是像你想要的那样运行。