6

したがって、、などを使用する場合、jQueryチェーンコールバック内のキーワードはDOM要素であることが標準であることがわかって$.fn.eachいます$.fn.bindthis

私の開発では、少なくともDOM要素をjQueryセットでラップする必要があることを知っています。90%の確率で実行することになりvar $this = $(this)ます。ラップされていない要素にバインドすることを選択した理由には、(おそらくパフォーマンスベースの)良い理論的根拠があったと確信していますが、それが正確に何であるかを誰かが知っていますか?

これは、答えを知っていると、図書館と言語をより深いレベルで理解するための扉が開かれるかもしれないと私が感じていることの1つです。

4

2 に答える 2

2

ジョン・レシグがこの質問に具体的に対処している記事を誰かが指摘できない限り、決定的な答えが提供されているとは思えません。しかし、jQuery を使い始めたとき、私はよくこれを疑問に思い、それが最も害が少ないという結論に達しました。結局、必要なのは DOM 要素だけという可能性は十分にあります。その周りにjQueryラッパーを使用する必要がある/使用したい場合$()は、わずか3回のキーストロークで済みます(または、より多くの人がそうしていますvar $this = $(this);)。複数の関数呼び出しとメモリ割り当てを含むライブラリが常にそれを行うのとは対照的に、ライブラリが必要ない場合があります。

たとえば、次のことを考慮してください。

$("input").each(function() {
    // Use this.value
});

そこには、DOM 要素を jQuery ラッパーで囲む理由はまったくありません。this.valueすべてのinputフィールドに必要なのはこれだけです( 以外ですinput type="file"val()、そこでも役に立ちません)。イベント ハンドラー (thisも "生の" 要素) では、まったく見なくてもかまいませんthis

しかし、この場合:

$(":input").each(function() {
    var val = $(this).val();
    // Use `val`
});

... を使用する本当の理由があり$(this)ます。:inputセレクターは、値が異なるプロパティから取得されるいくつかの異なる要素タイプ ( inputselect、 ) に一致しbutton、それを抽象化します。textareaval()

したがって、生の要素を提供することはパフォーマンスの問題であると結論付けました。まったく使用しない場合、または基本的な DOM プロパティのみを使用する場合は、jQuery インスタンスでラップする必要はありません。あなたがそれをする必要がある/したい場合は、コードでそれを行うことができます。

于 2012-01-09T00:25:28.450 に答える
2

良い(パフォーマンスベースの可能性が高い)根拠があったと確信しています

まさにこれだとおもいます。jQuery ラッパーを必要としない可能性がある場合 (これはあります。特に のような関数へのコールバックで、DOM プロパティを直接操作することはほとんどありvalません。実際、要素をまったく見る必要がない場合があります)。 jQuery オブジェクトの作成に時間と処理リソースを無駄にしたくありません。

例として、ループ内のすべての要素を実行すると、関数自体が実行するのと同じくらいのオーバーヘッドが発生することを示すjsperfを次に示します。$(this)each

于 2012-01-09T00:27:43.840 に答える