4

我不得不在我的项目中使用json2.js,因为浏览器(IE8)JSON 对象不可用于将字符串解析为 JSON。

我浏览了 json2.js 并且对变量声明有疑问。

JSON 全局变量在 json2.js 中声明,例如

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

声明var JSON;对全局 JSON 对象有什么影响。我希望声明应该覆盖任何浏览器(IE8/IE7)中的全局 JSON 对象。但令我惊讶的是,当全局对象可用时,它并没有覆盖。只有变量定义/启动会覆盖全局变量?请澄清。

4

4 回答 4

3

var 关键字确保封闭函数中有一个变量,或者(像这里一样)在 window 中有一个变量,但它不会初始化一个。

事实上,订单并没有真正影响。

以这段代码为例:

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 附加到函数,而不是块...

于 2012-05-02T18:28:12.893 回答
3

对于每个变量声明(不是初始化!)。发生以下情况(部分#10.5):

8.对于代码中的每个VariableDeclarationVariableDeclarationNoIn d,按源文本顺序执行

  1. dnd中的标识符
  2. varAlreadyDeclared成为调用env 的HasBinding 具体方法并传递dn作为参数的结果。
  3. 如果varAlreadyDeclaredfalse,则
    1. 调用env 的CreateMutableBinding 具体方法,传递dnconfigureBindings作为参数。
    2. 调用env 的SetMutableBinding 具体方法,传递dnundefinedstrict作为参数。

所以你看,无论何时遇到,都会测试环境中是否已经存在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;覆盖第一个,因为此时它还没有任何价值。所以这不是一个很好的例子来展示上面引用的行为。

于 2012-05-02T18:36:07.463 回答
0

它可能不适合您,但也可以将 IE8 设置为兼容模式以获取本机 JSON 对象:

// in your preinit page event
Response.AddHeader("X-UA-Compatible", "IE=8");

另一种选择是仅在 JSON 变量不存在时才创建它:

var JSON = JSON || {};
于 2012-05-02T18:27:55.400 回答
-1

如果您在执行该代码块时处于全局范围内,则 var JSON 会将全局 JSON 对象覆盖为未定义。

如果您在任何其他范围内(例如在函数内部),则不会有任何效果。

于 2012-05-02T18:26:46.020 回答