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 に答える