51

SafariとChromeで発生しているエラーについて、次のコード行を使用して洞察を深めたいと思います。

setTimeout(window.location.reload, 250);

Chromeのレポート:
Uncaught TypeError: Illegal invocation

そしてSafari:
TypeError: Type error

FireFoxでは、コードは正常に実行されます。また、このコードは3つのブラウザーのそれぞれで正常に実行されます。

setTimeout((function() {
  window.location.reload();
}), 250);

ChromeとSafariには、このコードに問題はありません。

var say_hello = function () { alert("hello") };  
setTimeout(say_hello, 250);  

window.location.reloadこのエラーの原因となる特別な点は何ですか?

(それが有用かどうかはわかりませんが、これを説明するjsfiddleがあります)

4

4 に答える 4

87

としてreload()必要なので。言い換えれば、それはのメソッドです。あなたが言う時:window.locationthiswindow.location

var fun = window.location.reload;

fun();

reload()参照なしthisで(または暗黙の参照を使用して)関数を呼び出していますwindow

これは機能するはずです:

setTimeout(window.location.reload.bind(window.location), 250);

このwindow.location.reload.bind(window.location)部分の意味は次のとおりです。関数を取得し、呼び出されたときに内部の参照としてwindow.location.reload使用する関数を返します。window.locationthisreload()

も参照してください

于 2012-05-31T19:29:33.373 に答える
4

これを行う別の方法があります。これは非常に単純で、追加の手順やバインディングなどを行う必要はありません。JSの一般的な関数の代わりに矢印関数を使用すると、thisコンテキストが含まれます。したがって、次のことも同じように簡単に行うことができます。

setTimeout(() => window.location.reload(), 250);
于 2020-09-24T06:51:04.787 に答える
3

を呼び出すときthisにバインドする必要があるためです。それは試してみるのと同じです:locationreload

var reload = window.location.reload;
reload();

thiswindow非厳密モードと厳密モードになりundefinedますが、どちらも無効です。

古いブラウザでは、代わりに次のことができます。

reload.call( location )

またはあなたの例では:

setTimeout( window.location.reload.bind( window.location ), 1000 )

ただし、古いIEは、ホストオブジェクトの明示的なバインドをサポートしていません。

これは、次のようなジェネリックではないいくつかのネイティブメソッドでも取得できます。

var a = function(){}.toString;
a();
TypeError: Function.prototype.toString is not generic

いくつかは一般的です:

var fakeArray = {0:1,1:2,length:2};
fakeArray.join = [].join;
fakeArray.join( " " );
"1 2"
于 2012-05-31T19:31:14.080 に答える
2

locationこれは、コンテキスト(関数の)が欠落しているために失敗しthisます。bindたとえばunderscore.jsbindメソッドでこのように使用する前に、コンテキストを確認する必要があります

var boundReload = _.bind(window.location.reload, window.location);
setTimeout(boundReload, 500)

これは、通常、次のようなオブジェクトを含む関数から呼び出される他の関数と同じです。console.log

于 2012-05-31T19:33:12.097 に答える