我正在编写一个 GreaseMonkey 脚本(使用 JQuery),并且我需要一些由原始页面中的脚本设置的变量,如下所示:
<script type="text/javascript">
var rData = {"20982211":[1,0,1],"20981187":[8,0,4]};
</script>
我从另一个页面获取这个元素并尝试评估它,奇怪的是这不起作用:
$.get(link_url, null, function(data) {
alert("1:" + rData);
eval($(data).find("script").text());
alert("2:" + rData);
}
奇怪的是,当我运行脚本时,它可以在 firebug 控制台上工作(我只是在没有 .get 的情况下直接在目标页面上尝试了 eval),但它没有。它在两个警报中都给了我“null”。
有任何想法吗?
EcmaScript 5 重新定义eval
这样它就无法将变量绑定添加到封闭的词法环境中。
http://whereswalden.com/2011/01/10/new-es5-strict-mode-support-new-vars-created-by-strict-mode-eval-code-are-local-to-that-code-仅有的/ http://whereswalden.com/2011/01/10/new-es5-strict-mode-support-new-vars-created-by-strict-mode-eval-code-are-local-to-that-code-only/谈论问题eval
在 ES 3 下。
但与此同时,eval 太强大了。正如内联汇编对于 C 或 C++ 的作用(至少没有 gcc 的 asm 语法所需的信息)一样,eval 对于 JavaScript 也是如此。在这两种情况下,强大的构造都会抑制许多优化。即使您不关心优化或性能,eval 引入和删除绑定的能力也会使使用它的代码更难以推理。
...
eval 添加绑定的能力较差。这使得在运行时之前无法说出名称所指的内容:
var v;
function test(code)
{
eval(code);
return v;
}
return语句中的v是否表示全局变量?如果不知道代码 eval 将编译和运行,你就无法知道。如果该代码是“var v = 17;”它引用一个新变量。如果该代码是“/* psych! */”,则它指的是全局变量。函数中的 eval 将取消优化该函数中引用封闭范围内的变量的任何名称。 (并且不要忘记名称 test 本身位于封闭范围内:如果函数返回 test 而不是 v,则在不知道代码的情况下无法判断该测试是引用封闭函数还是新变量。)
解决您的问题的一种可能的解决方案是使用不同的评估结构,例如(new Function('alert(rData); ' + ... + '; alert(rData);'))
引入了完整的词汇环境。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)