旧版本IE中JSON对象的问题

Problems with the JSON object in old version of IE

本文关键字:对象 问题 JSON 版本 IE      更新时间:2023-09-26

作为一个测试,以确保调用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"错误。为什么指定窗口。JSON不抛出错误?为什么不指定窗口。JSON,但使用var JSON不抛出错误?这只是我不应该担心的愚蠢的IE东西,还是这种结果很危险,会成为其他浏览器的问题?

注意"console"也是如此

访问未定义的全局变量总是会抛出。访问对象的未定义属性总是返回undefined。虽然window是global的别名,但这并不会改变这里的规则,访问window的undefined成员将返回undefined

至于为什么第二个例子没有抛出,是因为所有的var都被提升到封闭作用域,不管它们出现在哪里,在该作用域中执行任何代码之前。这意味着即使没有执行var,也定义了JSON变量,它将只包含undefinedvar做了两件事:在作用域中创建一个变量,并可选地初始化该变量。变量的创建被提升到作用域的顶部,赋值在它出现的地方执行。所有变量在赋值之前都包含undefined。如果赋值没有执行,它们将保持undefined。在同一作用域中重复的var将被忽略。这意味着如果JSON已经在作用域中,var将被忽略。

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