Json2:为什么全局范围内的“var JSON”不会破坏全局JSON对象?

时间:2011-04-22 18:40:49

标签: javascript json scope

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

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

通常,声明var会将“某些东西”设置为undefined:

var something = {};

(function(){
    var something;

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

通常我会通过使用:

来实现这一目标
var JSON = JSON || {};

那么全局JSON对象是什么允许编写“var JSON”而不将其设置为undefined?

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

1 个答案:

答案 0 :(得分:2)

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

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

在这个特定情况下

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

var JSON = JSON || {};

非常相同。这只是风格偏好的问题。

现在,如果他把它放在自执行匿名函数中,那么本地JSON将设置为undefined。

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