我花了最近3天试图缩小问题,现在发现它我无法理解。
我想检查一个函数是否存在,如果没有创建它。然而,JS总是说函数存在,即使不存在。
检查:
if (!blablabla) {
function blablabla() {
//do stuff
}
alert("1");
}
else{
alert("2");
}
它应该警告1但总是警告2!
答案 0 :(得分:4)
那是因为该功能始终存在。
声明函数时,它在代码开始运行时存在于整个范围内。函数声明被提升到作用域级别,因此如果在if
语句中或在其外部声明它,则无关紧要。
如果要在运行时创建函数,则必须将其创建为函数表达式,并将其分配给变量:
if (!blablabla) {
blablabla = function() {
//do stuff
};
alert("1");
}
else{
alert("2");
}
答案 1 :(得分: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(){};
}
答案 2 :(得分:0)
if ( typeof blablabla !== 'function' ) {
blablabla = function() {
//do stuff
};
alert("1");
}
else
{
alert("2");
}