这是我的代码:
<div class='a'>
<div class='b'>Test</div>
</div>
Run Code Online (Sandbox Code Playgroud)
和
$(['.b']).each(function () {
console.log($('.a').find(this).text()); // Expecting to print "Test"
});
Run Code Online (Sandbox Code Playgroud)
我希望console.log打印Test,但它没有!这是一个jQuery错误吗?
这里有一些问题.
$.each,请使用迭代通用对象或数组的静态版本.有了这两点说,有STIL使用的问题$.each包含原始值的数组.以下代码显示您遇到的相同问题:
$.each([".b"], function () {
console.log($('.a').find(this).text()); // Expecting to print "Test"
});
Run Code Online (Sandbox Code Playgroud)
在回调函数中.each,this是一个String 对象而不是字符串原语.为了理解这一点,我们需要了解.each幕后的内容:
for (; i < length;) {
if (callback.apply(object[i++], args) === false) { // <----
break;
}
}
Run Code Online (Sandbox Code Playgroud)
重要的是呼叫apply.根据ECMAScript规范,当传递原始值时apply,将toObject调用值的方法:
如果thisArg为null或未定义,则调用的函数将作为此值传递给全局对象.否则,被调用的函数将ToObject(thisArg)作为此值传递.
这解释了为什么你的代码不起作用 - .find期望一个字符串原语而不是String对象.
这就是为什么实际提到使用原始值的文档$.eachthis:
(也可以通过this关键字访问该值,但Javascript将始终将此值包装为Object,即使它是一个简单的字符串或数字值.).
因此,解决代码问题的方法是利用element传递给回调函数的参数:
$.each([".b"], function (_, item) {
console.log($('.a').find(item).text()); // Expecting to print "Test"
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
828 次 |
| 最近记录: |