2016-06-15 116 views
0

我看到有grep一些有趣的行爲......jQuery grep不適用於元素屬性?

// 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] 
=> [] 

正如你看到的,唯一的區別是,在第一次成功的代碼,我定義了一個獨立的ID變量。爲什麼grep要求並且不允許我傳遞元素屬性?或者我做錯了什麼?我無法在文檔中找到解釋。

+0

'console.log($(this))',看看它是否是指什麼! –

+1

$ .grep中的$(this)是什麼? – mplungjan

回答

-1

不像很多jQuery的功能,​​不改變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()代替,這將提供行爲你正在期待。

+1

不知道,謝謝! – james

+0

@downvoter,謹慎解釋? – dave

3

這是因爲上下文。當您將函數傳遞給$.grep時,該函數內的上下文this將爲window

,您可以控制和.bind不同的上下文中,像這樣:

var inventory_item = $.grep(gon.items, function(e){ return e.id == $(this).data("id") }.bind(this))[0]