2011-12-02 22 views
33

Arguments.calleeは推奨されていません - 代わりに何を使うべきですか?

setTimeout(function() { 
    ... 
    setTimeout(arguments.callee, 100); 
}, 100); 

ようなことをやって、私はarguments.calleeようなものが必要。

このプロパティは、名前の関数 式の賛成で、より良いパフォーマンスを得るためにECMA-262によってが廃止されました:私はarguments.calleeが廃止されましたinformation at javascript.infoことがわかりました。

代わりに何を使用する必要がありますか?これって何?

setTimeout(function myhandler() { 
    ... 
    setTimeout(myhandler, 100); 
}, 100); 
// has a big advantage that myhandler cannot be seen here!!! 
// so it doesn't spoil namespace 

ところで、arguments.calleeクロスブラウザ互換性がありますか?

+2

WHの場合:

function callback(){ //... setTimeout(innercall(), 100); function innercall(){ //innercall is safe to use in callback context innercall.caller(); //this will call callback(); } } 

はその後、我々はコールバックを参照して、我々がやりたいことが安全ですそれは価値があります:[名前のついた関数式はdemystified](http://kangax.github.com/nfe/)。 – sdleihssirhc

+0

はい、関数に名前をつけ、その名前をsetTimeoutに使用する必要があります。 – kubetz

+1

[JavaScriptでarguments.callee.callerプロパティが非推奨となったのはなぜですか?](http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in- javascript) – cHao

答えて

10

はい、理論的には、となるはずです。あなたが正しい。ただし、いつものようにInternet Explorerの一部のバージョンでは動作しません。ので注意してください。 IE上で作業を行い

function callback() { 
    // ... 
    setTimeout(callback, 100); 
} 

setTimeout(callback, 100); 

:あなたは、むしろ、シンプルをarguments.calleeにフォールバックする必要がある、またはあります。

+1

待ってください - あなたは 'setTimeout(function myhandler(){setTimeout(myhandler ...')はIEのいくつかのバージョンでは動作しません、これは標準ではないのですか? 。 – TMS

+3

@TomasT:It * is * standardですが、IEが完全に標準になったのはいつですか?:)(まあ、多分IE10です。)それはしばらく時間を掛けてしまったことを覚えています。少なくともIE7でおそらくIE6ですが、テストするために私にはありません – Ryan

+0

Microsoftによると、IE6で動作します。 -property-arguments-javascript –

5

代わりに何を使用する必要がありますか?これって何?

はい、あなた自身の質問に答えました。詳細については、こちらをご覧ください:

Why was the arguments.callee.caller property deprecated in JavaScript?

それは、この変更が行われた理由についてかなり良い議論を持っています。

+0

Jonathanに感謝します。 – TMS

0

minitech回答はかなり良いですがもう一つシナリオがありません。コールバックと呼ばれる宣言関数は2つのことを意味します。最初は関数がメモリ内のオブジェクトであり、2つ目の関数名はオブジェクトを参照するためのものです。何らかの理由で、これらの2つの間の参照を破棄した場合、提案されたコードも機能しません。

証明:説明でdeveloper Mozilla pageから

function callback() { 
    // ... 
    setTimeout(callback, 100); 
} 

setTimeout(callback, 100); 

var callback2 = callback; //another reference to the same object 
callback = null; //break the first reference 
callback2(); //callback in setTimeout now is null. 

である:

警告:のECMAScript(ES5)の第5版は、厳密モードで arguments.calleeを()の使用を禁止します。 arguments.callee()を で使用することは避けてください。関数式に名前を付けるか、関数がそれ自身を呼び出す必要がある関数 宣言を使用してください。

明らかにこれは、回避策の第一の例である「のいずれかを与える機能によって名前を表現」が、我々が対処「または関数が自体を呼び出す必要があります関数宣言を使用」することができますどのように確認することができますし、それは何をもたらすでしょう。

var callback2 = callback; 
callback = null; 
callback2(); //will work perfectly. 
+0

'caller'は良い習慣ではありませんここのサンプルコードは実際にはタイムアウトを設定していないようです。宣言した関数を上書きしないでください。 – Ryan

関連する問題