2

特定のコンテキストで次の関数を実行する必要があります。

setTimeout(function () {
    myFunction();
}, 1000 * 60);


var changeDateFormat = function () {
    console.log(this); // this should be $('.myClass') 
                       // but I need to set it from setTimeout
                       // any hints
};

PS:
私はUnderscore.jsとjQueryを使用しています。

4

5 に答える 5

3

jQuery.proxyを使用できます。

setTimeout($.proxy(myFunction, $(".myClass")), 1000 * 60);

例を次に示します: http://jsfiddle.net/UwUQD/1/

Jamesが言ったようapplyに、jQueryが内部的に行うように使用することもできます:

proxy = function() {
    return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
};

最初のapply引数は実行コンテキスト (を使用してアクセスできるものthis) で、2 番目の引数は myFunction に渡す他の引数です。関数は同じですが、追加の引数のcall受け入れ方が少し異なります。


または、Underscore.js でbindを使用します

setTimeout(_.bind(myFunction, $(".myClass")), 100);

http://jsfiddle.net/UwUQD/3/

于 2012-11-19T15:28:21.093 に答える
0

JavaScript呼び出しを使用して関数のスコープを設定するか、関数を適用できます。それらがどのように機能するかの詳細については、このチュートリアルを参照してください。

スコープを設定することで、「this」を好きなように設定できます。

于 2012-11-19T15:30:53.097 に答える
0

たぶん、次のようなものが役立ちます:

var changeDateFormat = function () {
    console.log(this); // this should be $('.myClass') 
                       // but I need to set it from setTimeout
                       // any hints
};

function callWithContext() {
   changeDateFormat.call($(".class"));
}

setTimeout(callWithContext, 1000 * 60);
于 2012-11-19T15:34:34.653 に答える
0

呼び出す関数を呼び出し、目的のオブジェクトを最初のパラメーターとしてcall渡します。this

setTimeout(function () {
    myFunction.call($('.myClass'));
}, 1000 * 60);
于 2012-11-19T15:35:55.503 に答える
0

bindを使用して、コールバックを目的のコンテキストにバインドできます。
これの欠点は、一部のブラウザーがこれをサポートしていない可能性があることです。しかし、JS の基本原則に固執すれば、クロージャーも完璧に役立ちます。

var callBack = (function(that)
{//<-- use "that" instead of "this"
    return function()
    {
        console.log(that);
    };
}($('.myClass')));//<-- pass value for that here
setTimeout(callBack,60000);
于 2012-11-19T16:00:10.540 に答える