2013-01-14 4 views
6

あなたがChromeでthis fiddleを見て、あなたがこれを見ることができます開くJSコンソールでトリガテキストをクリックした場合:はなぜChromeは使用しない `インラインイベントのためWITH`

enter image description here

が理由は何ですかそれらのすべてのwithブロックとその価値は何ですか?

+0

これは、インラインイベントがどのように機能するかを示しています。 – SLaks

+1

@SLaks 'this [2]'、 'this [1]'、 'this [0]'の値は何ですか? – MosheK

+0

@SLaksこの動作がどこに書かれているか知っていますか?それとも、現代のブラウザで実行されているスクリプトを1997年から守るのに役立つのでしょうか?対象の要素と文書のすべてのプロパティをスコープにダンプすると少し奇妙に思えます。 – Pointy

答えて

6

HTMLの「onclick」属性として指定されている場合、ブラウザがイベントハンドラの関数を作成する方法と同じように見えます。私は何ことがないことだと思う

  • イベントオブジェクトとあなたの供給コードのための単一のパラメータを持つイベントハンドラ関数を作ります。
  • 要素のプロパティ(<a>タグ)、空のオブジェクト(?)、およびドキュメントオブジェクトは、その関数内のコードで使用可能なシンボルとして表示されます。 、this[0]ある
this[1]

は空のオブジェクトインスタンスのように見え、そしてthis[2]がドキュメントオブジェクトである、<a>素子自体です。これが意味することは、コードでは "onfoo"イベントハンドラ属性の一部として(そしてではなく、普通のイベントハンドラ内のコードはストレートJavaScriptコードからバインドされています)、ターゲット要素のプロパティを参照することが可能です。属性を設定する要素)と、文書要素のプロパティがあたかもスコープチェーン内にあるかのようにします。

あなたがコードを少し変更した場合:

$('<a href=# onclick="console.log(baseURI);"> ... 

を、あなたは<a>要素の「基底URI」プロパティの値を取得します。 <a>要素のDOMノードを明示的に参照するものを "baseURI"の前に置く必要はありません。いくつかの囲いの範囲でvarと宣言されたかのようにちょうど "そこに"あります。

(...今W3Cの仕様をチェックする)編集 —私はシンボルがイベントハンドラ内のスクリプトコードが利用できるようになっているものを規定している何かを発見していません。これは本当に奇妙です。

編集再び — Firefoxは、私はどこにも明示的with文が表示されていないものの、同じことをやっているようです。

+0

'with'ステートメントがコンソールで実行中のアーティファクトである可能性はありますか?私たちは、コンソールが不要な 'eval'ステートメントを紹介していることを知っています。これは同様のメカニズムかもしれませんが、私は本当に**理由**について本当に考えていません。:-) –

+2

@ScottSauyetよく、私は 'with'文がどこから来たのか正確にはわかりません。私を驚かせる部分は、 'with'文の**効果**であり、Firefoxも同様の動作です。 – Pointy

+1

これは標準的な動作です(残念ながら)。 http://jibbering.com/faq/names/event_handler.html、http://www.w3.org/TR/html5/webappapis.html#internal-raw-uncompiled-handler – Bergi

1

withスコープスタックの上に引数を移動します。だから、グローバルオブジェクト、ファンクションパラメータなどよりもさらに高いです。なぜ彼らがそれを使うのか分かりません。おそらくそれは生成されたコードです。

関連する問題