4

関数に渡されたすべてのパラメーターを の関数に渡す最良の方法に苦労していますsetTimeout。つまり、以下の例では 1 つのパラメーターを渡していますが、これが複雑になるにつれて見苦しくなります (複数のパラメーター)。私はそれをたくさんやるので、これを行うためのきれいなパターンを望んでいます。

onSessionTimeComboChange: function (combo, newValue, oldValue, eOpts) {
    var me = this;
    me.newValue = newValue;
    setTimeout(function () {
        var x = me.newValue;
        debugger;
    }, 100);
}
4

2 に答える 2

4

Javascript はクロージャーをサポートしているため、必要なパラメーターを任意のコールバックに簡単に渡すことができます。

function bar(x, y, z) {
    console.log([x, y, z]);
}

for (var i=0; i<5; i++) {
    (function(x, y, z){
        setTimeout(function(){bar(x, y, z);}, i*1000+1000);
     })(i, i*2, i*3);
}

唯一のトリッキーな部分は、ただ言うことができないということです

setTimeout(function(){bar(i, i*2, i*3)}, i*1000+1000);

クロージャーは(現在の値ではなく)変数をキャプチャするため、この場合、登録されたすべての関数は実際には同じi値を使用します。

于 2013-09-01T20:26:39.837 に答える
4

コールバックでメイン関数変数にアクセスできない理由は、によって実行されるコードが、それが呼び出された関数とはsetTimeout()別の実行コンテキストで実行されるためです。簡単に言えば、thisコールバックでは同じではありません。

コールバックをコンテキストにバインドする関数を提供する Javascript ライブラリを使用したくない場合 ( jQuery.proxyおよびunderscore.bindを参照)、これを修正するために独自の非ネイティブsetTimeout関数を作成する必要があります。

Web API ドキュメントで提案されているソリューションは次のとおりです(セクションを参照The "this" problem)。

window.setTimeout = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
  var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2);
  return __nativeST__(vCallback instanceof Function ? function () {
    vCallback.apply(oThis, aArgs);
  } : vCallback, nDelay);
};

そこまで行きたくない場合は、コードを改善して、引数を のパラメータとしてコールバックに渡しますsetTimeout

var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);

詳細については、 JavaScript Web APIを確認してください。

したがって、あなたの例では、次のように書くことができます:

setTimeout(function (x) {
    debugger;
}, 100, newValue);
于 2013-09-01T20:18:37.613 に答える