jQuery中的循环闭包

时间:2013-02-01 22:14:21

标签: jquery closures

没有回调函数jsFiddle的那个会产生错误的结果。控制台日志应显示i = 0& j = 0,如“group [0] record [0]”所示。因为我试图找到dd / dt集:“书:书名”。

我知道我需要包含类似于this post的回调函数。但是我似乎不明白如何正确插入函数。这是我正在研究的那个:

jsfiddle w/ callback

var arrDL = [];
$("dl").each(function(i) {     
   arrDL[i] = [];
   $(this).children("dt").each(function(j){ 
       function(n){
            return function(){
                var $this = $(this); 

                arrDL[n][j] = {
                   title: $this.text(),
                   description: $this.next("dd").text()
                };

                if($this.text() == "Book:" && $this.next("dd").text() == "another book name"){
                   console.log("group 0 record 0: " + n + '-' + j);
                };
           };    
      }(n);               
  });    
});

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您正在函数内部创建一个函数(在内部each的回调内部)并返回它。您正在执行外部函数,但它返回一个您不执行的函数引用,因此内部函数内的代码将永远不会运行。

此外,您将变量n发送到外部函数,但它从未在任何地方定义,因此它只是undefined

实际上不需要外部或内部函数,只需将代码放入each的回调中:

var arrDL = [];
$("dl").each(function(i) {     
  arrDL[i] = [];
  $(this).children("dt").each(function(j){ 
    var $this = $(this);
    arrDL[i][j] = {
      title: $this.text(),
      description: $this.next("dd").text()
    };
    if($this.text() == "Book:" && $this.next("dd").text() == "another book name"){
      console.log("group 0 record 0: " + i + '-' + j);
    };
  });    
});

您得到的结果是正确的,在第二组中找到“另一本书名称”的描述,而不是第一组。