如果if块中的函数是typeof ==' function'如果if条件是假的?

时间:2014-09-08 18:43:23

标签: javascript scope

考虑以下代码(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行为?

2 个答案:

答案 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