3

setIntervalグローバル変数を使わずに使うには?次のように、 setInerval によって呼び出される関数のすべての変数をある種のクロージャーでラップすることをお勧めします。

var wrap = function (f){
 var local1, local2, ...;
 return function () { return f(); }
}

これは機能しませんが、towrap(f)の代わりに渡すことで、 locals forが適切にラップされ、グローバル スコープを汚染しないようにするという考えです。fsetIntervalf

4

2 に答える 2

4

JavaScript には動的バインディングがありません (このキーワードを除く)。

匿名関数を使用すると、アイデアをアーカイブできます。(閉鎖といいます)

var fnc = function(){
    var local1, local2;

    return function(){
         // using local1, local2
    }
};

setInterval(fnc, 1000);
于 2012-08-03T17:34:22.247 に答える
2

このようなものを探していると思います...

var wrap = function (f){
    var locals = Array.prototype.slice.call(arguments, 1);
    return function () { f.apply(this, locals); }
};


function logger_func() {
    console.log.apply(console, arguments);
}

for (var i = 0; i < 10; i++) {
    setTimeout( wrap(logger_func, i, "foo_" + i), // <-- wrapping i
                i * 1000 );
}

setTimeout最新の環境では、追加の引数を...に渡すことができることに注意してください。

for (var i = 0; i < 10; i++) {
    setTimeout(logger_func, i * 1000, i, "foo_" + i);
}
于 2012-08-03T17:52:46.450 に答える