2010-10-29 100 views
1

我正在通過O'Reilly jQuery Cookbook。在p.65中,有一個例子對我來說看起來不太合適,但我對jQuery不太熟悉(不到一週),所以我認爲我很可能是一個感到困惑的人。jQuery.map()和迭代

該代碼打算從有序列表中獲得前三項&對它們做些什麼;爲了簡單起見(在書的部分),選擇器中只有一個列表。

他們給出了下面的代碼(我稍微簡化了一下,但沒有在相關部分);外層的兩層當然是樣板文件(關閉,因此$將按需要工作,並且代碼在頁面加載時發生這種情況)。

(function($){ 
    $(document).ready(function(){ 
     var arr = $.map($('li'), function(item, index){ 
      while (index < 3) 
      { 
       return $(item).html(); 
      } 
      return null; 
     }); 
     /* do something with the resulting array; 
      I've deliberately simplified from the book here */ 
     alert(arr.join(","); 
    }); 
})(jQuery); 

的顯式迭代(while)沒有道理給我。據我瞭解,內部匿名函數應該爲數組的每個元素調用一次,所以我期望if,而不是while

回答

1

該循環將永遠不會執行多次。它在功能上等同於if,我相信這就是作者的意圖。在O'Reilly網站上有unconfirmed errata list

+0

的第一包裝是不是'document.ready'處理程序。 – 2010-10-29 16:39:18

+0

也不是。今天真糟糕! – lonesomeday 2010-10-29 16:40:25

+0

明白了。當然,回報可以避免實際上不正確,但'如果'會更加清晰。 – 2010-10-29 16:46:42

0

是的,你的理解是正確的。這是一個不好的例子。

0

該代碼應該if那裏,while只存在因爲return,這是一個有點while在這種情況下,濫用的,海事組織。

:lt()說明,可以縮短整個那個例子下來:

(function($){ 
    $(function(){ 
    var arr = $('li:lt(3)').map(function(){ 
     return $(this).html(); 
    }).get(); 
    alert(arr.join(","); 
    }); 
})(jQuery); 
+2

通過返回語句將無限期保存下來。鑑於微小的代碼修改,仍然非常差,並且可能不安全。 – user113716 2010-10-29 16:40:53

+0

你得到相同的輸出while或if - 但如果顯然是正確的。 – ScottE 2010-10-29 16:41:08

+0

@patrick - 哎呀你是對的,專注於重寫這個 – 2010-10-29 16:41:29