开发者问题收集

使用 $.each 上的调用

2015-10-04
31

我尝试了以下代码片段:

$.each.call({foo: 'bar'}, [1,2,3], function(i){console.log(i, this);})

我以为它会打印出 {foo: 'bar'} 作为 this 值,但它打印的是项目(这是 $.each 的预期行为)。有人能解释为什么 this 值没有被覆盖吗?

2个回答

this 设置为 obj 的原因似乎是 jQuery.each() 源代码的这些部分

value = callback.apply(obj[i], args);

value = callback.call(obj[i], i, obj[i]);

其中 callback 是传递给 jQuery.each() 的函数,其中 obj 设置为 this :传递给每个迭代的数组或对象参数

function (obj, callback, args) {
    var value, i = 0,
        length = obj.length,
        isArray = isArraylike(obj);

要在 jQuery.each() 回调中设置 this ,请尝试在传递给 jQuery.each(obj, callback) 的回调函数上使用 Function.prototype.bind()

$.each([1,2,3], function(i){console.log(i, this);}.bind({foo:"bar"}))
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
guest271314
2015-10-04

另请注意,您不需要 jquery 进行这些类型的操作,因为您只需使用普通的 javascript 即可:

 [1,2,3].map(function(i){ console.log(i, this); }.bind({foo:'bar'}) );
rism
2015-10-04