【问题标题】:JavaScript 'strict mode' not working as expected?JavaScript“严格模式”没有按预期工作?
【发布时间】:2015-09-14 22:37:06
【问题描述】:
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 犯了一个错误。我认为“严格”模式会抓住它,但没有。在这种情况下,这不应该引发错误吗?

【问题讨论】:

    标签: javascript strict


    【解决方案1】:

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

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

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

    超级混乱 :D


    "use strict" 会阻止定义新的全局变量,这里我们正在对现有变量执行赋值,将其视为name 在全局范围内,如window.Blobwindow.console 等。

    【讨论】:

    • 不应该"use strict" 完全阻止这种情况吗?
    • @JanDvorak "use strict" 会阻止定义新的全局变量,这里我们正在执行对现有变量的赋值,将其视为name 在全局范围内,比如window.Blobwindow.console等等。
    • @KarolyHorvath 重点是,即使您没有定义名为 name 的变量,浏览器也会在全局范围内为您执行此操作。
    • 另请注意,严格模式在节点中捕获错误很好(因为没有“窗口”)。
    • @georg 是的,在主机对象未定义 name 属性的任何环境中,严格模式错误(应该如此)。
    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 2016-06-19
    • 2020-11-25
    • 2016-11-18
    • 1970-01-01
    相关资源
    最近更新 更多