なぜ、 `window [" eval "] .call(ウィンドウ、データ);`

jQuery 1.7rc1の614行目:

window ["eval"] .call(window、data);

単純に書くのではなく

eval.call( window, data );?

9

2 答え

答えは次のとおりです: jQueryのデコード

Jim Driscoll氏は、より多くの標準に準拠したブラウザでは、   eval.call(window、data)を使うことができますが、ChromeやIEの場合は、   少し違います。

     

Internet Explorer:IEはwindow.execScript(data)を使用しているようです。

     

Chrome:eval.call(ウィンドウ、データ)はChromeで破損しますが、ウィンドウ["eval"   ] .call(ウィンドウ、データ)はChromeで動作し、他の非IE   これは上記の回避策がどのように基づいているかを示しています。

7
追加された
Chrome 14では、少なくとも eval.call はうまく動作します。
追加された 著者 James Allardice,
うん、それも私が思ったことだ。私はちょうどそれがクロム14で動作していることに気づいていた。jQueryはブラウザが動作しない限り永遠に続くだろう。
追加された 著者 James Allardice,
私は説明を見つけただけの理由を書かなかった....クロム14は古いバージョンよりも標準に近いもので、jqueryはクロスブラウザーを目指しており、現在のブラウザーではない。
追加された 著者 scrappedcola,

ソースを見ると、このリンクをご覧ください。強調されたテキストを見てみましょう:

悲しいことに、 eval.call(window、src)はChromeで壊れます。   コンテキストが一致しません。奇妙な - 私はGoogleにこれをなぜできなかった   そうかもしれない。しかし、後でいくつかの幸運な推測、私はそれを発見   window.eval.call(window、src)はIE以外のすべてのブラウザで動作します。   "var j = 1"と言うと、ウィンドウ[j]は設定されている変数です...だから、   それは良い。なぜ追加のウィンドウを追加する必要があるのですか? Chromeで?ない   確かに - 私は推測できるが、間違っている可能性が高い。

したがって、 window.eval はChromeで globalEval を使用するために使用されます。

3
追加された
Chrome 14では正常に動作しているようですが、その記事は2009年のものですから、現在修正されているChromeのバグであれば驚くことはありません。
追加された 著者 James Allardice,
ええ、私は知っています。私はそれが現在Chromeで動作することに気づいていました。もちろん、古いChromeがある限り、jQueryは古いChromeの修正をそこに保存しなければなりません。
追加された 著者 James Allardice,
@JamesAllardiceまだChromeの最新バージョンを使用していないユーザーはいます。 jQueryは、できるだけ多くのブラウザをサポートするように設計されています。
追加された 著者 Rob W,
@Neil現在の回答で window.eval が必要な理由が説明されていないことがわかりました。このソースを見てください。これは、 eval メソッドの非常に徹底的な分析です。 perfectionkills.com/global-eval-what-are-the-options/…
追加された 著者 Rob W,
では、 window.eval(data)の何が問題になっていますか?
追加された 著者 Neil,
そのリンクをありがとう、それは window.eval.call(window、src)が不必要に長く続くことを説明します。実際、(window.execScript || eval)(src)で十分です。 (execScriptを使いたくない場合は、 window.eval(src)が一番良い方法です)。
追加された 著者 Neil,