これは私のコードです:
<div class='a'>
<div class='b'>Test</div>
</div>
と
$(['.b']).each(function () {
console.log($('.a').find(this).text()); // Expecting to print "Test"
});
console.log
が印刷されることを期待していますTest
が、そうではありません。これは jQuery のバグですか?
これは私のコードです:
<div class='a'>
<div class='b'>Test</div>
</div>
と
$(['.b']).each(function () {
console.log($('.a').find(this).text()); // Expecting to print "Test"
});
console.log
が印刷されることを期待していますTest
が、そうではありません。これは jQuery のバグですか?
ここにはいくつかの問題があります。
$.each
を使用してください。これらの両方が言われても、プリミティブ値を含む配列を使用することにはまだ問題があります。$.each
次のコードは、あなたが見たのと同じ問題を示しています。
$.each([".b"], function () {
console.log($('.a').find(this).text()); // Expecting to print "Test"
});
のコールバック関数内.each
にthis
は、String
オブジェクトがあり、文字列プリミティブではありません。これを理解するには、内部で何.each
が行われているかを確認する必要があります。
for (; i < length;) {
if (callback.apply(object[i++], args) === false) { // <----
break;
}
}
重要なのは への呼び出しapply
です。ECMAScript 仕様によると、プリミティブ値が に渡されるapply
と、値のtoObject
メソッドが呼び出されます。
thisArg が null または未定義の場合、呼び出された関数にはグローバル オブジェクトが this 値として渡されます。それ以外の場合、呼び出された関数は ToObject(thisArg)として this 値として渡されます。
これは、コードが機能しなかった理由を説明しています.String.find
オブジェクトではなく、文字列プリミティブを期待しています。
これが、プリミティブ値の使用について実際に言及しているドキュメントの理由です。$.each
this
( this キーワードを使用して値にアクセスすることもできますが、Javascript は、 this 値が単純な文字列または数値であっても、常にオブジェクトとしてラップします。 )
したがって、コードの問題を解決する方法はelement
、コールバック関数に渡される引数を利用することです。
$.each([".b"], function (_, item) {
console.log($('.a').find(item).text()); // Expecting to print "Test"
});
this
配列をループするときは、inside each を使用しないでください。オブジェクトまたは要素のコレクションでは正常に機能しますが、配列では失敗します。
の 2 番目の引数を使用each
して配列要素にアクセスします
$(['.b']).each(function (index, item) {
console.log($('.a').find(item).text()); // Expecting to print "Test"
});
それは、あなたが JavaScript の暗黒面にいるからです。
JavaScript では、実際に何にバインドされていても、this
常にObject
so thatになります。プリミティブ文字列がコンテキストにバインドされている場合でも(これは を与えると予想されます)、実際にはオブジェクトであり. この動作の詳細な説明は次のとおりです。typeof this === "object"
this
this
typeof this === "string"
this
String
typeof this === "object"
非オブジェクトの配列を反復処理するときは、コールバック関数の 2 番目の引数を値として使用する必要があります。
$(['.b']).each(function (index, value) {
console.log($('.a').find(value).text()); // Expecting to print "Test"
});