6

私はいくつかの古いコードを「厳密モード」に移植することに取り組んでいますが、ECMA5標準のargument.calleeおよび同様のargument.callerなどの代替手段は何ですか?


追加情報:argument.caller/calleeが必要な理由を指定しませんでした。

私が移植しているコードは使用しています

assert.ok(elemNode, arguments.callee.name + ": Entity - " + entityId + " has been found");

単純な再帰であれば、function name(){... function()...}を使用できますが、上記のコードをどうするかがわかりません。

4

4 に答える 4

7

ECMAScript 3以降では、名前付き関数式を使用できます。それ以前は、関数式は匿名であったため、arguments.callee必要になりました。名前付き関数式はそれを不要にしました。したがって、これが推奨される代替手段です。

呼び出し先のMDNドキュメントを参照してください

例:

[1,2,3,4,5].map(function factorial (n) {
    return !(n > 1) ? 1 : factorial(n-1)*n;
});

名前付き関数の利点(MDNドキュメントから):

  • この関数は、コード内から他の関数​​と同じように呼び出すことができます
  • 名前空間を汚染しません
  • この値は変更されません
  • パフォーマンスが向上します(argumentsオブジェクトへのアクセスにはコストがかかります)
于 2013-03-21T20:38:38.890 に答える
3

あまり。

セキュリティ上の理由で削除されたプロパティを模倣または「ポリフィル」する方法はないため、コード内でスコープチェーンを上ることはできません。arguments.caller

の最良の代替手段arguments.calleeは、次のような無名関数式ではなく、名前付き関数式を使用することです。

setTimeout(function loop() {
    if( /* condition */ ) {
        loop();  // instead of arguments.callee();
    }
}, 1000);

これは、ほとんどすべての実装で高速です(argumentsオブジェクトへのアクセスは一般的にやや遅いです)

于 2013-03-21T20:38:13.393 に答える
1

関数に名前を付けてから、その名前で関数を参照する必要があります。

于 2013-03-21T20:36:37.877 に答える
0

厳密に言えば、同等のものはありません。John Resigが指摘しているように、ECMAScript 5 の厳密モードで「匿名」関数に名前を付ける必要があり、その後、それらを直接呼び出すことができます。彼の例は次のとおりです。

setTimeout(function later(){
  // do stuff...
  setTimeout( later, 1000 );
}, 1000 );
于 2013-03-21T20:41:30.163 に答える