在 Eval 中设置变量 (JavaScript)

Fab*_*ndl 2 javascript ajax jquery greasemonkey eval

我正在编写一个 GreaseMonkey 脚本(使用 JQuery),并且我需要一些由原始页面中的脚本设置的变量,如下所示:

<script type="text/javascript"> 
    var rData = {"20982211":[1,0,1],"20981187":[8,0,4]};
</script>
Run Code Online (Sandbox Code Playgroud)

我从另一个页面获取这个元素并尝试评估它,奇怪的是这不起作用:

$.get(link_url, null, function(data) {
   alert("1:" + rData);
   eval($(data).find("script").text());
   alert("2:" + rData);
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,当我运行脚本时,它可以在 firebug 控制台上工作(我只是在没有 .get 的情况下直接在目标页面上尝试了 eval),但它没有。它在两个警报中都给了我“null”。

有任何想法吗?

Mik*_*uel 5

EcmaScript 5 重新定义eval,以便它无法将变量绑定添加到封闭的词法环境。

\n

http://whereswalden.com/2011/01/10/new-es5-strict-mode-support-new-vars-created-by-strict-mode-eval-code-are-local-to-that-c​​ode-只/讨论evalES 3下的问题。

\n
\n

但与此同时,eval 太强大了。正如内联汇编对于 C 或 C++ 的作用(至少没有 gcc\xe2\x80\x98s asm 语法所需的信息)一样,eval 对于 JavaScript 也是如此。在这两种情况下,强大的构造都会抑制许多优化。即使您不关心优化或性能,evalxe2x80x98 引入和删除绑定的能力也会使使用它的代码更难以推理。

\n

...

\n

eval\xe2\x80\x98s 添加绑定的能力较差。这使得在运行时之前无法说出名称所指的含义:

\n
\n
var v;\nfunction test(code)\n{\n  eval(code);\n  return v;\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

return语句中的v是否表示全局变量?你可以\xe2\x80\x99不知道代码eval是否会编译并运行。如果该代码是“var v = 17;” 它引用一个新变量。如果该代码是“/* psych! */”,则它指的是全局变量。函数中的 eval 将取消优化该函数中引用封闭范围内的变量的任何名称。(并且不要忘记名称 test 本身位于封闭范围内:如果函数返回 test 而不是 v,则您无法说出该测试是否引用封闭函数或不知道代码的新变量。)

\n
\n

解决您的问题的一种可能的解决方案是使用不同的评估结构,例如(new Function(\'alert(rData); \' + ... + \'; alert(rData);\'))引入完整的词汇环境。

\n