旧版本IE中JSON对象的问题
Problems with the JSON object in old version of IE
作为一个测试,以确保调用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
变量,它将只包含undefined
。var
做了两件事:在作用域中创建一个变量,并可选地初始化该变量。变量的创建被提升到作用域的顶部,赋值在它出现的地方执行。所有变量在赋值之前都包含undefined
。如果赋值没有执行,它们将保持undefined
。在同一作用域中重复的var
将被忽略。这意味着如果JSON
已经在作用域中,var
将被忽略。
这不是愚蠢的IE东西,所有符合ES5的JavaScript实现都需要遵循我上面概述的规则。
相关文章:
- node.js for循环在函数调用返回之前进行迭代,从而产生对象问题
- Safari 和 IE 中的 JavaScript 日期对象问题
- Knockoutjs 绑定对象问题
- Angular2 奇怪的硬编码对象与 http.get 对象问题
- Javascript 循环 + 对象问题:如何使用循环获取对象中的必需项
- 全局对象问题
- 量角器页面对象问题
- JavaScript对象问题
- 嵌套循环未形成完整对象 - 问题
- ExpressJS PUT方法未定义的对象问题
- 显示对象的对象问题
- React-Router的历史对象问题
- javascript的对象问题
- javascript中的对象问题
- Javascript对象问题
- JavaScript:对象问题
- 谷歌图书API JSON对象问题
- WebMethod返回JSON对象问题
- 对象问题中的 Jquery 对象
- Javascript 对象问题