根据我对闭包的理解 - 基于例如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技能非常新颖。