我在[{1}} ...
中看到了一些有趣的行为grep
正如您所看到的,唯一的区别是在第一个成功的代码中我定义了一个单独的id变量。为什么// where gon.items = array of objects with various properties, one of which is id
var id = $(this).data("id")
var inventory_item = $.grep(gon.items, function(e){ return e.id == id })[0]
=> successfully retrieves object
var inventory_item = $.grep(gon.items, function(e){ return e.id == ($(this).data("id")) })[0]
=> []
需要这个而不允许我传递元素属性?或者我做错了什么?我在文档中找不到解释。
答案 0 :(得分:3)
那是因为背景。当您将函数传递给$.grep
时,该函数中的上下文this
将为window
。
你可以控制它和.bind
不同的上下文,如下所示:
var inventory_item = $.grep(gon.items, function(e){ return e.id == $(this).data("id") }.bind(this))[0]
答案 1 :(得分:-1)
与许多jQuery函数不同,jQuery.grep()
不会将this
的上下文更改为正在迭代的当前项。实际上,在grep
回调中,this
保留了它的全局上下文,并且在浏览器中将引用window
对象。所以最有可能$(this).data("id") === undefined
。
以下是一个演示此内容的快速摘录:
var g = [1, 2, 3];
$.grep(g, function(item) {
console.log(this === window);
return false;
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
如果您正在处理一组jQuery元素,您可能希望使用.filter()
代替,这将提供您期望的行为。