2012-09-13 10 views
6

可能性の重複:setTimeoutに関数のパラメータを渡すときに
setTimeout Internet ExplorerIEパラメータは未定義取得

私はここで何かをしないのですかそこには、Internet Explorerの問題であり、同じ関数を呼び出す?

これは、Internet Explorerで永遠に実行されます:

function myFunction(myParam, tries){ 
    if (typeof tries == "undefined"){ 
    tries = 0; 
    } 
    tries++; 
    if (tries < 2){ 
    setTimeout(myFunction, 50, myParam, tries); 
    } 
} 
myFunction("something"); 

は、その問題を回避する方法はありますか?

http://fiddle.jshell.net/rH3gx/

+0

これは私の時間か2にしましたなぜ私の外側スコープ変数wを理解する「未定義」とする。 Internet Explorerが最悪です! –

答えて

14

説明と解決策はin the MDNです:

あなたがコールバック関数に引数を渡す必要がありますが、それ が送信をサポートしていませんInternet Explorerの中で作業する必要がある場合 のブラウザで HTML5標準パラメータの継承機能を有効にするこのIE固有の互換性コードを含めることができます(setTimeout()またはsetInterval両方のタイマーをスクリプトの先頭に挿入するだけです。

if (document.all && !window.setTimeout.isPolyfill) { 
    var __nativeST__ = window.setTimeout; 
    window.setTimeout = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) { 
    var aArgs = Array.prototype.slice.call(arguments, 2); 
    return __nativeST__(vCallback instanceof Function ? function() { 
     vCallback.apply(null, aArgs); 
    } : vCallback, nDelay); 
    }; 
    window.setTimeout.isPolyfill = true; 
} 

if (document.all && !window.setInterval.isPolyfill) { 
    var __nativeSI__ = window.setInterval; 
    window.setInterval = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) { 
    var aArgs = Array.prototype.slice.call(arguments, 2); 
    return __nativeSI__(vCallback instanceof Function ? function() { 
     vCallback.apply(null, aArgs); 
    } : vCallback, nDelay); 
    }; 
    window.setInterval.isPolyfill = true; 
} 
+0

setTimeoutはIE10のパラメータで動作するようです。しかし、私はIE10 +の機能のサポートを文書化しているものは何も見つかりません。 MSDNはまだサポートされていないことを示しています。http://msdn.microsoft.com/library/ie/ms536753.aspx –

+1

@KevinBabcock MDNはMSDNよりも正確です。https://developer.mozilla.org/en/ docs/Web/API/window.setTimeout#Browser_compatibility –

7

http://fiddle.jshell.net/rH3gx/2/

あなたは引数を必要としない関数で関数をラップする必要があります。

function myFunction(myParam, tries){ 
    if (typeof tries == "undefined"){ 
    tries = 0; 
    } 
    tries++; 
    if (tries < 2){ 
    setTimeout(function() { 
     myFunction(myParam, tries); 
    }, 50); 

    } 
} 

myFunction("something"); 
+0

これは私にとってうまくいっています –

+0

は、それらの50msの間に引数が変更されても機能しません – denns