4

请参阅下面的代码。为什么会test2()导致错误而test1()不会?如何避免错误(无需在构造函数中重新定义被调用函数)?

function getRandomInt(min, max) {
        return Math.floor(Math.random() * (max - min + 1)) + min;
    }
var xyz = function (){
                var test1 = function () { getRandomInt(10, 20); };
                test1();  // runs with out problem 
                var test2 = new Function('getRandomInt(10, 20);');
                test2(); //results in "Uncaught ReferenceError: getRandomInt is not defined"
                };
4

2 回答 2

5

我假设所有这些都在另一个函数中(也许是一个 IIFE?)。创建的代码new Function在全局范围内进行评估,似乎getRandomInt在那里不可用。

检查 jsfiddle 上的这些演示:在 unwrapped 时有效,但在 IIFE 内无效

如果您需要在当前范围内评估代码,则必须使用eval

var test2 = eval('(function(){return getRandomInt(10, 20);})');

http://jsfiddle.net/7wPK4/2/

参考

于 2013-10-02T22:47:06.733 回答
2

我在 MDN 上找到了这个:

使用 Function 构造函数创建的函数不会为其创建上下文创建闭包;它们总是在全局范围内创建。运行它们时,它们将只能访问自己的局部变量和全局变量,而不能访问调用 Function 构造函数的范围内的变量。这与将 eval 与代码用于函数表达式不同。

所以也许你getRandomInt不在全球范围内?需要查看整个代码,或者重新创建问题的 jsFiddle。

于 2013-10-02T22:58:27.537 回答