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

有没有更可读的方式来表达javascript闭包?,javascript,closures,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, buildUpdat

我想在用户单击对象时用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));

这是可行的,但让我想知道是否有比为两个函数调用编写闭包变量更简洁的方法来实现这一点。有什么提示吗?

是的,第二个闭包是多余的

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);

为什么不干脆这样做呢

marker.on("click", function () {
    $.getJSON(url, function (data) {
        updateParticipants(marker, title, data, popmsg);
    });
});
看起来更具概括性-至少在我看来:-)

但是要注意:如果变量
标记
标题
等可以更改,并且您不希望更改,那么您需要额外的闭包。例如,如果您在循环中调用此函数,并且变量
marker
(或其他变量)在循环中更改!然后,您需要将代码封装在循环中的另一个闭包中:

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

一旦你知道如何使用闭包,闭包是JavaScript非常好和强大的特性。看看道格拉斯·克罗克福德(Douglas Crockford)的“JavaScript编程语言”(JavaScript Programming Language)视频,他们用一种很好的方式解释了这一点。

这些闭包中有一半似乎毫无意义(因为它们只被调用一次,调用可以不断折叠)。这段代码是否恰好在一个循环中?@delnan:是的,有几个标记,这是一个循环。对不起,我把那个部分弄错了。@Mangrangs:我希望哈斯克尔:派斯,你说得对,我们刚刚交叉发布了我已经添加了一条关于何时需要添加闭包的说明。好的,谢谢。删除评论(因为它不是我答案的一部分)。确实是多余的。谢谢。我想我现在已经把我的大脑正确地绕了几圈了。