我在过去的三天里试图缩小一个问题,但现在我发现它我无法理解。
我想检查一个函数是否存在,如果不存在则创建它。然而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(){};
}
这将有条件地在所有浏览器中创建一个全局 bar 函数。变量声明将仅在当前执行上下文中创建函数
if (typeof bar == 'undefined') {
var bar = function(){};
}
if ( typeof blablabla !== 'function' ) {
blablabla = function() {
//do stuff
};
alert("1");
}
else
{
alert("2");
}