这里有一些问题。
- 当您使用数组调用 jQuery 时(就像您正在做的那样),jQuery 期望它是一个 DOM 元素数组。
- 如果您想使用
$.each,请使用 static version 迭代通用对象或数组。
说到这两点,仍然将$.each 与包含原始值的数组一起使用存在问题。以下代码显示了与您看到的相同的问题:
$.each([".b"], function () {
console.log($('.a').find(this).text()); // Expecting to print "Test"
});
在.each 的回调函数中,this 是一个String object,而不是一个字符串primitive。要理解这一点,我们需要看看 .each 在幕后做了什么:
for (; i < length;) {
if (callback.apply(object[i++], args) === false) { // <----
break;
}
}
重要的是调用apply。根据 ECMAScript 规范,当一个原始值被传递给apply 时,该值的toObject 方法被调用:
如果 thisArg 为 null 或未定义,则调用的函数将作为 this 值传递给全局对象。 否则,调用的函数将作为 this 值传递给 ToObject(thisArg)。
这解释了为什么您的代码无法正常工作--.find 需要字符串原语而不是字符串对象。
这就是为什么the documentation for $.each 实际上提到使用带有原始值的this:
(该值也可以通过 this 关键字访问,但 Javascript 将始终将 this 值包装为 Object,即使它是简单的字符串或数字值。)。
因此,解决代码问题的方法是利用传递给回调函数的 element 参数:
$.each([".b"], function (_, item) {
console.log($('.a').find(item).text()); // Expecting to print "Test"
});