旧版IE中JSON对象的问题

时间:2011-10-05 23:26:44

标签: javascript json internet-explorer

作为确保调用JSON对象的测试在IE中没有失败我最近将其添加到我的js库中:

//Works
//if(!JSON) var JSON={};
//JSON.stringify = JSON.stringify || function(){};
//Works
//if(!window.JSON) JSON={};
//JSON.stringify = JSON.stringify || function(){};
//Does not work
//if(!JSON) JSON={};
//JSON.stringify = JSON.stringify || function(){};
//Best of both!
if(!window.JSON) var JSON={};
JSON.stringify = JSON.stringify || function(){};

当我说“不起作用”时,我的意思是它在IE7中不起作用并抛出“JSON blah blah blah blah”错误。为什么指定window.JSON不会抛出错误?为什么不指定window.JSON但使用var JSON不会抛出错误?这只是愚蠢的IE浏览器,我不应该担心或者是这种危险的结果,并且会成为其他浏览器的问题吗?

注意“控制台”也是如此。

1 个答案:

答案 0 :(得分:3)

访问未定义的全局变量将始终抛出。访问对象的未定义属性将始终返回undefined。 window是全局别名的事实不会改变这里的规则,访问未定义的窗口成员将返回undefined

至于为什么第二个例子不抛出是因为所有var都被提升到封闭范围,无论它们出现在何处以及在该范围内执行任何代码之前。这意味着即使JSON未执行,也会定义var变量,它只包含undefinedvar执行两项操作,在范围内创建变量,并可选择初始化变量。创建变量将被提升到范围的顶部,分配它将在它出现的位置执行。所有变量都包含undefined,直到为它们分配值。如果未执行分配,则它们将保持undefined。忽略同一范围内的重复var。这意味着,如果JSON已在范围内,则忽略var

这不是愚蠢的IE东西,所有符合ES5标准的JavaScript实现都需要遵循我上面概述的规则。