javascript if block 的奇怪行为

Javascript weird behaviour of if block

本文关键字:if block javascript      更新时间:2023-09-26

在javascript中声明函数时,我遇到了这种奇怪的行为。我无法理解原因。谁能解释一下。

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

它显示错误阻止的警报!!

阅读有关 JavaScript 提升的信息

变量声明和函数声明被提升到 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。 因为第二个定义覆盖第一个定义。

这是因为myFun功能被提升了。你永远不应该在 if 语句中声明这样的函数。改为检查函数中是否true了某个变量。

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

Javascript中没有块级范围。在 if 块中声明的所有变量实际上都被吊装起来了。因此,当你编写 if else 时,实际的函数变量myFun else 块中被覆盖并被提升。

在范围界定和提升过程中,您的函数myFun被覆盖,因此要避免这种行为,请尝试此操作

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

如果要动态分配 myFun,则应使用以下语法

if (true) {
    myFun=function(){alert('true');}
}else{
    myFun=function(){alert('false');}
}
myFun();

因为如果您使用的是 function MyFun() 声明样式,则该函数是在解析时定义的,而不是您想要的 runtimr。