Eval 不声明函数

Eval not declaring functions

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

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

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

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

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

eval 在一个非常特殊的环境中工作,这个环境在很多方面很像 local 范围。因此,如果您在函数内对该字符串调用 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>

如果你想在全球范围内声明它,你必须做一些工作。 Kangax wrote up an excellent discussion of the options "global eval"。其中一个选项是 David Flanagan 建议的选项:

var geval = this.execScript || eval;

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

function doSomething(str) {
  var geval = this.execScript || eval;
  geval(str);
  snippet.log(typeof someName); // "function"
}
doSomething("function someName() { }");
snippet.log(typeof someName); // "function"
<!-- 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>

如上所述,

eval 仅适用于它的本地范围,但是,您可以声明另一个版本的 eval 函数,并将其添加到 window 对象,以便可以访问评估的代码函数来自全球背景:

// add global 
window.$eval = eval;
// now use $_eval version wherever you want 
function someFunction(){
   // use the $eval function 
   window.$eval('function doSomething() { }');
}

someFunction();
typeof doSomething == 'function' // true