jQuery的每个函数都在数组元素的上下文中执行回调函数:
$.each([3], function () {
console.log(this === 3);
console.log(this.valueOf() === 3);
});
我期待true true
,但得到false true
。这表示阵列的元素被每个函数装箱。
我的问题分为两部分:
答案 0 :(得分:5)
1)来自jQuery.each docs:
$ .each()函数可用于迭代任何集合, 无论是对象还是数组。在数组的情况下, 回调传递一个数组索引和相应的数组值 时间。 (也可以通过this关键字访问该值,但是 Javascript将始终将此值包装为Object,即使它是 一个简单的字符串或数字值。)
此始终是JavaScript中的对象。
2)您可以像这样重写代码:
$.each([3], function (key, value) {
console.log(value === 3);
});
答案 1 :(得分:5)
我的猜测是,当使用$.each()
调用.call()
回调并且3
作为第一个参数传递时,它将成为javascript始终将{ {1}}到一个对象,因为3
指针始终应该是一个对象。
Oleg的一个有趣的观察是,在严格模式下,你得到this
和true
作为输出。请参阅演示:http://jsfiddle.net/jfriend00/hjpQG/
再次感谢Oleg,here's a reference描述了它没有在严格模式下装入对象。
并且an ECMAScript reference from apsillers包含此步骤:true
。这个步骤在JS引擎内部以任何方式调用函数的过程中发生(当不在严格模式下时)。
要在所有浏览器中解决此问题,您可以将"Else if Type(thisArg) is not Object, set the ThisBinding to ToObject(thisArg)"
更改为===
,也可以切换为使用传递给回调的第二个参数,这是未受干扰的值。
==
或者,如果您只是尝试支持支持严格模式的浏览器,则可以将严格模式与原始代码一起使用。
答案 2 :(得分:-6)