全局 JSON 变量覆盖
Global JSON variable override
我不得不在我的项目中使用json2.js因为浏览器(IE8(JSON对象不可用于将字符串解析为JSON。
我浏览了 json2.js并对变量声明有疑问。
JSON 全局变量以 json2 声明.js例如
var JSON;
if(!JSON){
JSON={};
}
声明var JSON;
对全局 JSON 对象有什么影响。我希望声明应该覆盖任何浏览器(IE8/IE7(中的全局JSON对象。但令我惊讶的是,当全局对象可用时,它不会覆盖。只有变量定义/启动覆盖全局变量?请澄清。
对于每个变量声明(不是初始化!发生以下情况(第 #10.5
节(:
8. 对于代码中的每个变量声明和变量声明NoIn d,按源文本顺序执行
- 设 dn 为 d 中的标识符。
- 让 varAlreadyDeclare 是调用 env 的 HasBinding 具体方法传递 dn 作为参数的结果。
- 如果 varAlreadyDeclare 为 false,则
- 调用 env 的 CreateMutableBinding 具体方法,将 dn 和 configurableBindings 作为参数传递。
- 调用 env 的 SetMutableBinding 具体方法,将 dn、undefined 和 strict 作为参数传递。
因此,您会看到,每当遇到var x
时,都会测试环境中是否已存在名称为x
的变量。如果是,则忽略它,但如果不是,则使用 undefined
声明和初始化变量。
由于代码在全局范围内运行,因此它会测试全局范围内是否存在JSON
。因此,如果JSON
已经存在,则var JSON;
将被忽略。
只是关于测试/解释这种行为的一些想法:
我不知道在 JavaScript 执行中的哪个点创建全局对象,但我假设在评估所有其他脚本之前。这意味着,JSON
存在并且在任何变量声明之前都有一个值,只有当您包含两个脚本时才能模拟(我猜也可以是内联的,它们在另一个之后被计算(。
尝试:
// script1.js
var foo = 'bar';
// script2.js
var foo;
if(!foo) {
foo = 'baz';
}
alert(foo);
// include script2.js after script1.js
结果如何?(作弊者看这里(。
每当您在单个脚本文件中时,所有变量声明都会被提升到顶部。所以如果你有
var foo = 'bar';
var foo;
if(!foo) {
foo = 'baz';
}
该脚本实际上执行为:
var foo;
var foo;
foo = 'bar';
if(!foo) {
foo = 'baz';
}
您实际上无法测试第二个var foo;
是否覆盖第一个,因为此时它还没有值。因此,这不是证明上面引用的行为的好例子。
var 关键字确保封闭函数中或窗口中(如此处(中有一个变量,但它不会初始化一个变量。
事实上,订单并没有真正影响。
以这段代码为例:
a = 3;
var a;
alert(a);
它提醒"3"。
因此,您显示的代码中的 var 声明只是确保测试中不会出现错误,并且不会删除现有值。
记住这一点是件好事,因为 javascript 中的一个常见错误是在一个函数中有多个 var 声明,并且对在 var 声明之前设置的值感到惊讶。例如运行以下命令:
if (true) {
a = 3;
}
// lot of code, at a different level
if (true) {
var a;
if (433/43==3) a=true;
if (a) alert('should not happen');
};
是的,var 附加到函数,而不是块......
这可能不适合您,但也可以将 IE8 设置为兼容模式以恢复本机 JSON 对象:
// in your preinit page event
Response.AddHeader("X-UA-Compatible", "IE=8");
另一种选择是仅在 JSON 变量不存在时才创建它:
var JSON = JSON || {};
如果您在执行该代码块时处于全局范围内,则 var JSON 会将全局 JSON 对象覆盖为 undefined。
如果您在任何其他范围内(例如在函数内部(,则不会有任何影响。
- 像createComment这样的各种自定义变量名在内联javascript中被覆盖,但在外部js中没有.为什么?
- 在javascript中使用覆盖变量是不是一种糟糕的做法
- 由于异步回调,变量被覆盖
- 被覆盖的 setTimeout 变量中的函数
- 定义变量是否比在 JS 中覆盖变量使用更多的资源
- 异步Javascript变量覆盖
- 表,并选择要传递到新页面的rRow(id)(这样它就不会覆盖行选择的变量)
- 敲除js变量覆盖
- 返回语句后的函数声明全局变量不会被覆盖
- 在 forEach 循环中覆盖的变量
- 如何保护全局变量以在 Node.js 中被覆盖
- 两个函数使用相同的变量,都不会覆盖其原始变量
- 长方程与覆盖变量
- 使用相同的覆盖变量的 JavaScript 对象
- 不覆盖变量
- 每次循环覆盖变量
- 从数据库读取时覆盖变量
- JavaScript -用户的安全覆盖变量
- 覆盖变量内容javascript
- 覆盖变量或检查是否存在