ホームページ  >  記事  >  ウェブフロントエンド  >  Javascript のヒント: array_jquery を走査するために for in ステートメントを使用しないでください

Javascript のヒント: array_jquery を走査するために for in ステートメントを使用しないでください

WBOY
WBOYオリジナル
2016-05-16 18:18:221014ブラウズ
まず、for in ステートメントを使用してみてはいかがでしょうか。

jqModal は、おそらく多くの人が使用したことがある jqModal のソース コード内に hs と呼ばれる関数があります。次のようなネストされたループ、
コードをコピー コードは次のとおりです。

for(var i in {jqmShow:1,jqmHide: 1})
for(var s in this[i])
if(H[this[i][s]])
H[this[i] [s]].w[i] (this);
return F;
}

トラバーサルの最初の for のターゲットは匿名オブジェクトですが、問題ありません。
2 番目の for in は、コンテキストに従って this[i] が配列オブジェクト (Array) であることを確認します。
多くの JS 先駆者は、配列オブジェクトの走査に for in ステートメントを使用しないように警告しています。パフォーマンスに加えて、予期しないバグが発生する可能性があります。先祖の言葉に耳を傾けなければ、目の前で苦しむことになります。
今日は、警告として受け取るために、jqModal を例に、この種のバグがいつ発生するかを説明します。
2 番目に、問題が再発します
キーワード: ネイティブ Array クラス、拡張 Array クラス
配列オブジェクトを走査するための for in ステートメントの潜在的なバグは次のとおりです。ネイティブ Array クラスが他のユーザーによって使用される js スクリプト ライブラリがプロトタイプ拡張されている (たとえば、追加の toJSON メソッド、つまり Array.prototype.toJSON=xxxx を追加する) 場合、展開された Array オブジェクトをトラバースするために for in を使用するロジックは、ロジックとは異なります。ネイティブの Array オブジェクトを走査する方法。
簡単な例としては、

コードをコピーします コードは次のとおりです:

var x=[1];
for(var s in x){
alert(s)
};

の場合、ネイティブ JS クラス。上記のステートメントは、alert メソッドを 1 回だけ実行する必要があり、s は配列のインデックス 0 です。ただし、Array クラスが追加の toJSON メソッドで拡張されている場合、上記のステートメントはアラートを 2 回実行します。1 回目は s がインデックス 0 で、2 回目は s がメソッド名「toJSON」です。

あなたが設計したコードのロジックがネイティブの Array クラスに基づいており、ある日同僚がページ上でサードパーティの JS ライブラリを参照し、そのライブラリがたまたま Array クラスを拡張した場合、結果は元のコードのロジックが維持できなくなる可能性が非常に高いと想像してください。

この種のネイティブ JS クラスを拡張するライブラリとしては、prototype.js が有名で、toJSON や each などの Array クラスに多くのメソッドを拡張しています。 jquery の創設者がプロトタイプについてなぜあんなに怒っていたのかがわかりました (多くの人が特別な理由で jquery とプロトタイプを同じページで使用します。noConflict だけでは解決できない予期せぬ競合問題が数多く発生するでしょう)。さらに、jqModal の作者が私の記事を理解したら、おそらくプロトタイプについて文句を言い、「配列トラバーサルに for in を使用するのは賢明ではありませんが、もっと悪いのはプロトタイプです...」と言うでしょう。

上で述べたように、jqModal を使用していて、同時に他の理由でプロトタイプを使用している場合、おめでとうございます。騙されました。この競合により、ie6 および ie7 で closeClass によって設定されたボタンを使用して jqModal のポップアップ ボックスを自動的に閉じることができなくなります。デバッグ コードをトレースすると、この記事の冒頭で説明した hs メソッドの for in ループ内に例外があることがわかります。 。 。
3. 問題を解決します。
配列を走査するときは、for in ではなく for var ステートメントを使用します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。