为什么在闭包中修改var而不保留值

时间:2016-07-21 21:10:53

标签: javascript variables scope closures

根据我对闭包的理解 - 基于例如How do JavaScript closures work?Closures,在闭包的外部(或父)函数中声明的变量可以在闭包中使用和修改,所以在闭包完成后,外部函数中的变量具有最后在闭包中赋值的值。

也许我的理解是不正确的,或者下面的代码中还有其他一些我无法理解的东西。 1

function showBoards(boards, outputTarget) {
  $.each(boards, function (index, board) {
    var brd = $("<p><span class='badge' style='background:" 
      + board.prefs.backgroundColor + ";'>" 
      + ((board.starred) ? "*" : " ") + "</span> " 
      + board.name + "</p>");
    $(outputTarget).append(brd);
  });
}

function loadTheLot() {
  var boards = [];
  Trello.get('/members/me/boards?filter=open&fields=name,url,prefs,starred')
    .success(function (response) { 
      $.extend(boards, response);
      showBoards(boards, "#boards");
      })
    .error(function () { console.log("Failed to load boards.");})
    ;
  //showBoards(boards, "#boards");
  loadCardsInList("To do this week", "#todocards");
  loadCardsInList("Waiting for response", "#waitingcards");
}

extend按预期工作。当我在&#34;成功&#34;内部调用showBoards函数时关闭,我页面上的输出整齐地列出了检索到的板。

当我在闭包的外部函数中调用showBoards函数时(如注释行所示),该页面根本不显示任何板。

当然$.each是一个伪装的循环,但它在一个从闭包调用的函数内部。据我所知,似乎并没有像for循环中的&#34;闭包那样#34; (Aka Outer Variable Trap正在这里。

问题:为什么在boards语句之后loadTheLot中声明的Trello.Get变量再次为空。

顺便说一下,我需要在整个Trello.get之外的板数组的原因是因为我想将板传递给loadCardsInList函数,因此卡可以显示板名而不是丑陋的标识符。 / p>

顺便说一下,我使用get().success().error()风格,因为有人出现类似问题的人被建议使用&#34; post-ajax回调&#34;确保一切都已完成。我之前使用的样式将成功和错误闭包作为Trello.get调用的第二个和第三个参数。

1 我对编程并不陌生,但我的javascript技能非常新颖。

0 个答案:

没有答案