【问题标题】:Json2: why does "var JSON" in global scope not clobber the global JSON object?Json2:为什么全局范围内的“var JSON”不会破坏全局 JSON 对象?
【发布时间】:2011-04-22 18:40:49
【问题描述】:

在 json2.js 的顶部(cmets 后的第 160 行:https://github.com/douglascrockford/JSON-js/blob/master/json2.js),是以下代码:

var JSON;
if (!JSON) {
    JSON = {};
}

通常,声明 var something 会将 "something" 设置为未定义:

var something = {};

(function(){
    var something;

    console.log(something); // logs undefined
})();

通常我会通过以下方式实现这个目标:

var JSON = JSON || {};

那么,允许写入“var JSON”而不将其设置为未定义的全局 JSON 对象是什么?

为什么像 Crockford 这样的人会推广一种在任何其他情况下都不会这样运作的技术?

【问题讨论】:

    标签: javascript json scope


    【解决方案1】:

    它对任何变量都执行此操作。再次在同一范围内声明它不会重置变量的值。我想这是变量提升的结果(所有声明都移到函数的顶部)。

    var a = 2;
    var a;
    console.log(a) // 2
    

    在这种特殊情况下

    var JSON;
    if (!JSON) {
       JSON = {};
    }
    

    var JSON = JSON || {};
    

    几乎是等价的。这只是风格偏好的问题。

    现在,如果他把它放在自执行匿名函数中,本地 JSON 将被设置为未定义。

    如果你问为什么他这样做,那是因为他不想覆盖原生 JSON 对象(如果存在),但我想你已经知道了。

    【讨论】:

    • 认为您在第一个示例中的意思是 console.log(a),因为是 console.log(2) 是 2!
    • @Alex K.:是的,我的意思是……修复了。谢谢。
    • 谢谢,我忘记了不同的作用域是触发器,而不是对 var 的重新声明。我已经习惯了提前做所有的声明!
    猜你喜欢
    • 2015-01-30
    • 1970-01-01
    • 2012-05-26
    • 2017-08-18
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多