次のコードがあります。
function fn($){
return function(){
innerFn = function(){
setTimeout(show, 1000);
};
show = function(){
$.alert("TEST");
}
}
}
しかし、1 秒後に関数show
を実行すると、$ is undefined と表示されます。この問題を解決するにはどうすればよいですか?
次のコードがあります。
function fn($){
return function(){
innerFn = function(){
setTimeout(show, 1000);
};
show = function(){
$.alert("TEST");
}
}
}
しかし、1 秒後に関数show
を実行すると、$ is undefined と表示されます。この問題を解決するにはどうすればよいですか?
ここでは、さまざまなことが行われています。最も重要なのは、innerFn が呼び出されないため、setTimeout が呼び出されないことです。これでうまくいくはずです。
function fn($){
return function(){
setTimeout(function(){
$.alert("TEST");
}, 1000);
}
}
fn(window)(); //triggers your alert after 1000ms
何も呼び出されないため、コードは意味がありません。
function fn($){
return function(){
innerFn = function(){
setTimeout(show, 1000);
};
show = function(){
$.alert("TEST");
}
}
}
fn
passing を呼び出すとwindow
、実行できる関数が返されるとしましょう。しかし、この関数には関数宣言しか含まれていないvar
ため、グローバルスコープを汚染することも忘れてしまいます。これは悪いことです。何も起こりません。
次のように、内部で少なくとも 1 つの関数呼び出しが必要です。
function fn($){
return function(){
var innerFn = function(){
setTimeout(show, 1000);
};
var show = function(){
$.alert("TEST");
}
innerFn();
}
}
fn(window)();
そして、それはうまくいきます。しかし、それは間違いなく冗長です。あなたはただ持つことができます:
function fn($){
return function(){
function show(){
$.alert("TEST");
}
setTimeout(show, 1000);
}
}
同じ結果を得るには。ただし、引数をsetTimeoutにバインドするだけが目的の場合は、 bindを使用できます。setTimeout
ドキュメントにあるようにの 3 番目のパラメーターを使用できますが、従来の理由により IE ではサポートされていないようです。
したがって、 will の例bind
は次のようになります。
function show() {
this.alert('test');
}
setTimeout(show.bind(window), 1000);
またwindow
、これはデフォルトでグローバル オブジェクトであるため、通常はそうする必要はなく、それだけalert
で十分です。ただし、アラートの文字列が示すように、これは実際のコードではなく単なるテストだと思います。
代わりに最初のパラメーターとして使用することを好みwindow
、 context objectthis
に興味がない場合は、次のようにすることができます。
function show($) {
$.alert('test');
}
setTimeout(show.bind(null, window), 1000);