次のコードがあります。
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");
}
}
}
fnpassing を呼び出すと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);