即使条件为false,Internet Explorer 7 + 8也会在IF内执行变量声明

时间:2014-08-12 08:41:18

标签: javascript jquery internet-explorer if-statement

以下JavaScript可在除IE 7和8之外的所有浏览器中正常运行:

if (typeof django != 'undefined') {
    console.log('Django admin loaded');
    var jQuery = django.jQuery;
}

此代码位于Django管理界面和公共页面中加载的JavaScript文件之上。 Django的管理员加载了自己的jQuery,所以我们最好使用那个...

但是,即使条件(typeof django != 'undefined')false,IE 7和8也会在此if语句中执行变量赋值。同时,console.log()未执行: - /删除var关键字,相同的代码在IE 7和8中也能正常运行:

if (typeof django != 'undefined') {
    console.log('Django admin loaded');
    jQuery = django.jQuery;
}

但为什么呢?这没有任何意义,是吗?

3 个答案:

答案 0 :(得分:5)

所有浏览器都会这样做。它被称为hoisting

function test() {
    if( false) {
        var abc;
    }
    alert(abc); // expect ReferenceError, get undefined
}

由于您正在定义jQuery,因此可能希望将其作为全局变量,因此window.jQuery = django.jQuery应该可以。

答案 1 :(得分:1)

javascript中没有块范围(请参阅此处了解JS范围的更多详细信息:What is the scope of variables in JavaScript?)。

您的初始代码无论如何都没有多大意义 - 如果您尝试设置全局jQuery变量,那么您的代码应该是:

if (typeof django != 'undefined') {
    console.log('Django admin loaded');
    jQuery = django.jQuery;
}

您所看到的可能与IE7和8处理其JS范围的方式有所不同。

答案 2 :(得分:0)

如果你定义了var关键字,那么你需要这样做:

if (typeof django != 'undefined') {
    console.log('Django admin loaded');
    var jQuery = django;
    django.jQuery; // or django = django.jQuery
}