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
我有一个已在其他地方使用 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