是否有更可读的方式来表达javascript闭包?

时间:2012-04-02 13:01:55

标签: javascript closures

当用户点击某个对象时,我想用JSON更新一些数据。我想出的是以下双重关闭。

var buildGetJSON = function(m,t,p,u) { 
  return function ()  {
    var buildUpdateParticipants = function(m,t,p) {
      return function(data) { updateParticipants(m,t,data,p); };
    };
    $.getJSON(u, buildUpdateParticipants(m,t,p));
  };
};
marker.on("click", buildGetJSON(marker, title, popmsg, url));

它有效,但让我想知道是否有更简洁的方法来为这两个函数调用写一个闭包变量。任何提示?

2 个答案:

答案 0 :(得分:3)

是的,第二次关闭是多余的。

function buildGetJSON(m,t,p,u) {
  return function() {
    $.getJSON(u, function(data) {
      updateParticipants(m,t,data,p);
    });
  };
}
marker.on("click", buildGetJSON(marker,title,popmsg,url));

如果您只使用buildGetJSON一次,则可以通过使buildGetJSON匿名来进一步简化它。

marker.on("click", function(m,t,p,u) {return function() {
  $.getJSON(u, function(data) {
    updateParticipants(m,t,data,p);
  });
};}(marker,title,popmsg,url));

这是完全使用匿名函数完成此操作的另一种方法。它不会崩溃成几行,但我认为它看起来更清晰。

!function(m,t,p,u) {
  marker.on("click", function() {
    $.getJSON(u, function(data) {
      updateParticipants(m,t,data,p);
    });
  });
}(marker,title,popmsg,url);

答案 1 :(得分:3)

为什么不简单地这样做?

marker.on("click", function () {
    $.getJSON(url, function (data) {
        updateParticipants(marker, title, data, popmsg);
    });
});

看起来更复杂 - 至少对我来说: - )

但请注意:如果变量markertitle等可能会发生变化,而您不希望这样,则需要额外的闭包。例如。如果你在循环中调用它,变量marker(或其他变量)在循环中改变!然后你需要将你的代码放在循环中的另一个闭包中:

for (marker in markers) {
    (function (marker) {
        // above code
    })(marker);
}

一旦你知道如何使用它们,闭包是非常好的,非常强大的JavaScript功能。看看Douglas Crockford的“The JavaScript Programming Language”视频,他们以一种很好的方式解释它。