考虑以下代码(http://jsbin.com/vewot):
var shouldDefine = false;
if(shouldDefine) {
function something() {
var a = 1;
}
}
alert(typeof something);
您希望警报显示什么?对我来说,我希望它能说" undefined",因为if块不应该运行,因为shouldDefine = false。在Firefox中,就是这样。
但在Chrome和IE9中,它表示'功能'!这是一个浏览器错误还是这种合法的JavaScript行为?
答案 0 :(得分:3)
通常,这种声明的行为是为当前作用域声明的任何变量具有该功能,该作用是全局作用域或函数调用(在ES5中)。
那就是:通常,这个函数是独立于测试值定义的:测试没用,函数声明是"悬挂"到封闭函数的开头,好像该测试不存在,无论结果如何。
但是在IE的某些版本中存在一个错误,其中测试用于定义函数,这使得此代码从那时起被视为未定义的行为(该案例的规范并不十分清楚)从...开始)。以及内部块isn't even valid in strict mode中的函数声明。
答案 1 :(得分:0)
您无法在if块中定义函数。正如人们已经说过的那样,这是实现定义的行为。但是,函数也是对象,因此您可以将它们分配给这样的变量:
var shouldDefine = false;
var something;
if(shouldDefine) {
something = function () {
var a = 1;
};
}
alert(typeof something);
如果'undefined'
为shouldDefine
,则会提醒false
,如果是'function'
,则会提醒true
。