为什么在条件执行块内声明的函数在进入该块之前似乎已经存在?

问题描述 投票:0回答:3

我在过去的三天里试图缩小一个问题,但现在我发现它我无法理解。

我想检查一个函数是否存在,如果不存在则创建它。然而JS总是说该函数存在甚至不存在。

检查:

if (!blablabla) {
  function blablabla() {
    //do stuff
  }

  alert("1");
} else {
  alert("2");
}

它应该警报 1 但始终警报 2!

javascript function declaration
3个回答
4
投票

那是因为函数始终存在。

当你声明一个函数时,它从代码开始运行起就存在于整个作用域中。函数声明被提升到作用域级别,因此无论您在

if
语句内部还是外部声明它都没有关系。

如果要在运行时创建函数,则必须将其创建为函数表达式,并将其分配给变量:

if (!blablabla) {

    blablabla = function() {

        //do stuff

    };

    alert("1");

}
else{

    alert("2");

}

3
投票

ECMA-262 可能看起来不允许条件函数声明,但有一个漏洞允许它们。在大多数浏览器中,以下内容将打印“bar!!”但在 Firefox 中,它会抛出引用错误,因为 bar 尚未定义。

function foo() {

  if (!bar) {
    console.log('no bar');
    function bar(){}

  } else {
    console.log('bar!!');
  }
}

foo()

为了避免引用错误,您可以使用:

  if (typeof bar == 'undefined')

但是,由于不同浏览器中的行为不同,使用条件声明并不是一个好主意。可以使用函数表达式来代替:

if (typeof bar == 'undefined') {
  bar = function(){};
}

这将有条件地在所有浏览器中创建一个全局 bar 函数。变量声明将仅在当前执行上下文中创建函数

if (typeof bar == 'undefined') {
  var bar = function(){};
}

0
投票
if ( typeof blablabla !== 'function' ) {
    blablabla = function() {
        //do stuff
    };
    alert("1");
}
else
{
    alert("2");
}
© www.soinside.com 2019 - 2024. All rights reserved.