JavaScript';严格模式';没有按预期工作?

JavaScript';严格模式';没有按预期工作?,javascript,strict,Javascript,Strict,在上面的代码中,我犯了一个错误,声明变量names,并使用name。我以为“严格”模式会抓住它,但它没有。在这种情况下,这不应该引发错误吗 Aname全局变量已存在,与您的代码无关;它表示当前窗口的名称,因此您正在分配给已存在的变量 var test = function() { 'use strict'; var mapNames = { 'name': 'City Name:', 'coord.lat': 'Latitute:' }

在上面的代码中,我犯了一个错误,声明变量
names
,并使用
name
。我以为“严格”模式会抓住它,但它没有。在这种情况下,这不应该引发错误吗

A
name
全局变量已存在,与您的代码无关;它表示当前窗口的名称,因此您正在分配给已存在的变量

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();
窗口
上的所有内容都声明为全局-因此它不是引用错误,因为它是分配给外部范围中的变量的

超级混乱:D

  • 关于MDN


“use strict”
会阻止定义新的全局变量,这里我们对现有变量执行赋值,将其视为
名称
在全局范围内,如
窗口.Blob
窗口.console
等。

不应该
使用strict”
完全阻止吗?@JanDvorak
“严格使用“
会阻止定义新的全局变量,在这里我们对现有变量执行赋值,将其视为
name
在全局范围内,如
window.Blob
window.console
等。@KarolyHorvath重点是,即使不定义名为
name
的变量,浏览器在全局范围内为您执行此操作。还请注意,严格模式在节点中捕捉到的错误很好(因为没有“窗口”)。@georg yes,在宿主对象未定义
名称
属性的任何环境中,严格模式错误(应该如此)。
window.name; // the name of the current window for cross-window communication