gpt4 book ai didi

javascript - 全局 JSON 变量覆盖

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:37:27 24 4
gpt4 key购买 nike

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

我运行了 json2.js,对变量声明有疑问。

A JSON global variable is declared in json2.js like

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

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

最佳答案

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

8. For each VariableDeclaration and VariableDeclarationNoIn d in code, in source text order do

  1. Let dn be the Identifier in d.
  2. Let varAlreadyDeclared be the result of calling env’s HasBinding concrete method passing dn as the argument.
  3. If varAlreadyDeclared is false, then
    1. Call env’s CreateMutableBinding concrete method passing dn and configurableBindings as the arguments.
    2. Call env’s SetMutableBinding concrete method passing dn, undefined, and strict as the arguments.

所以你看,每当遇到 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

结果如何? (cheaters look here)。


无论何时您在单个脚本文件中,所有变量声明无论如何都会被提升到顶部。所以如果你有

var foo = 'bar';
var foo;
if(!foo) {
foo = 'baz';
}

脚本实际执行为:

var foo;
var foo;
foo = 'bar';
if(!foo) {
foo = 'baz';
}

您实际上无法测试第二个 var foo; 是否覆盖了第一个,因为此时它还没有值。所以这不是一个很好的例子来证明上面引用的行为。

关于javascript - 全局 JSON 变量覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10419497/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com