在javascript中声明一个简单函数

在javascript中声明一个简单函数,javascript,function,declaration,Javascript,Function,Declaration,我花了三天的时间试图缩小一个问题,现在我发现它我无法理解 我想检查函数是否存在,如果不存在,请创建它。然而JS总是说函数存在,甚至不存在 检查: if (!blablabla) { function blablabla() { //do stuff } alert("1"); } else{ alert("2"); } 它应该向1发出警报,但总是向2发出警报 这是因为函数始终存在 当您声明一个函数时,它从代码开始运行起就存在于整个作

我花了三天的时间试图缩小一个问题,现在我发现它我无法理解

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

检查:

if (!blablabla) {

    function blablabla() {

        //do stuff

    }

    alert("1");

}
else{

    alert("2");

}

它应该向1发出警报,但总是向2发出警报

这是因为函数始终存在

当您声明一个函数时,它从代码开始运行起就存在于整个作用域中。函数声明被提升到作用域级别,因此无论是在
if
语句内部还是外部声明它都无关紧要

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

if (!blablabla) {

    blablabla = function() {

        //do stuff

    };

    alert("1");

}
else{

    alert("2");

}

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(){};
}
这将有条件地在所有浏览器中创建一个全局栏函数。变量声明将仅在当前执行上下文中创建函数

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

谢谢,但是对于JS引擎来说,它应该是相同的函数x()和x=function()。为什么第一个函数即使在代码的页脚中也会分配函数,而第二个函数会按预期工作?您的语句“这是因为函数始终存在”在所有浏览器中都不是真的。如果上述代码在函数范围内,Firefox允许条件函数声明,If语句将抛出引用错误,Bla将不存在,除非在别处创建。@Samul:函数声明在解析代码时完成,这意味着函数标识符在代码开始运行时存在。如果将函数表达式赋给变量,则变量在实际赋值之前不会得到值。@Samul-请参阅此问题以获得答案(阅读线程和注释;而不仅仅是最上面的答案)@RobG:该语句自然适用于问题中的实际代码,没有任何涉及函数的代码。为什么要将if(typeof blablabla!==“function”){更改为if(!blablabla){不能按预期工作?@MTO我很惊讶,因为blablabla将被提升到顶部。你能解释一下吗?@Samul-第一行被更改,因为你的要求是这样的“检查函数是否存在,如果不创建它”,通过这种方式可以检查
blablabla
是否是函数,而使用
if(!blablabla)
只检查
blablabla
的计算结果是否为
false
,原因可能有很多(例如早期的定义和赋值).@stackunderflow-见:
if (typeof bar == 'undefined') {
  var bar = function(){};
}