Eval没有声明功能

时间:2015-03-23 15:08:22

标签: javascript function eval

我有一个代码字符串,我已经在其他地方使用Blockly为我创建了代码字符串。它让我觉得它是正确的,当我直接回到页面时:

function someName(){
    //some code
}
//more code
someName();

但是,当我调用eval时,函数调用本身不起作用。它声称该功能未定义。除了函数声明之外的所有东西都在工作。代码字符串本身已设置,除非我进行大量解析,否则我无法对其进行更改。是否有一些更简单的方法来声明这些函数,以便代码可以调用它们?

测试用例(我实际使用过):

function test(){
    alert("This is a test");
}
test();

1 个答案:

答案 0 :(得分:1)

eval在非常特殊的环境中工作,这在许多方面与本地范围非常相似。因此,如果您在函数中对该字符串调用eval,则someName函数将仅在该函数中声明,例如:



function doSomething(str) {
  eval(str);
  snippet.log(typeof someName); // "function"
}
doSomething("function someName() { }");
snippet.log(typeof someName); // "undefined"

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;

如果你想要全局宣布它,你必须做一些工作。 Kangax wrote up an excellent discussion of the options for&#34; global eval&#34;。其中一个选项是David Flanagan建议的那个:

var geval = this.execScript || eval;

然后使用geval。这是因为IE具有execScript,它在全局范围内工作,而在其他浏览器通过引用它的变量间接调用eval 使其在全局范围内工作。但请阅读文章了解更多详情和选项。

&#13;
&#13;
function doSomething(str) {
  var geval = this.execScript || eval;
  geval(str);
  snippet.log(typeof someName); // "function"
}
doSomething("function someName() { }");
snippet.log(typeof someName); // "function"
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;