JavaScript的“严格模式”无法正常工作?

18
var test = function() {

    'use strict';

    var mapNames = {
        'name': 'City Name:',
        'coord.lat': 'Latitute:'
    };  

    for (var key in mapNames) {

        var names;

        if (mapNames[key]) {
            name = mapNames[key];
        } else {
            name = key;
        }
    }

    console.log(name);

}

test();
在上面的代码中,我在声明变量names并使用name时犯了一个错误。我认为使用'strict'模式会捕获它,但实际上并没有。按理说,这种情况不应该抛出错误吗?
1个回答

25

已经存在一个名为name的全局变量,与您的代码无关;它代表当前窗口的名称,因此您正在给一个已经存在的变量赋值。

window.name; // the name of the current window for cross-window communication

window上的所有内容都被声明为全局变量 - 因此,它不会因为在外部范围内分配给一个变量而产生引用错误。

非常令人困惑 :D


"use strict"将防止定义新的全局变量,这里我们正在对现有变量执行赋值操作,可以将其视为 name 在全局范围内,就像window.Blobwindow.console等一样。


1
“use strict” 不应该可以防止这种情况发生吗? - John Dvorak
3
"使用严格模式('use strict')将防止定义新的全局变量,但在这里我们对 现有变量 进行赋值操作,可以把它视为 name 在全局作用域中,就像 window.Blobwindow.console 等一样。" - Benjamin Gruenbaum
1
@KarolyHorvath 的意思是,即使您没有定义名为 name 的变量,浏览器也会在全局范围内为您定义它。 - John Dvorak
1
请注意,在Node中,严格模式可以很好地捕获错误(因为没有"window")。 - georg
1
@georg 是的,在任何主机对象未定义 name 属性的环境中,严格模式错误会(应该)出现。 - Benjamin Gruenbaum
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接