Есть ли более читабельный способ выразить закрытие JavaScript? - PullRequest
3 голосов
/ 02 апреля 2012

Я хотел бы обновить некоторые данные с помощью 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 ]

3 голосов
/ 02 апреля 2012

Почему бы просто не сделать это?

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

Выглядит гораздо более синоптически - по крайней мере для меня: -)

Но учтите: если переменные marker, titleи т.д. может измениться, и вы не хотите этого, тогда вам нужно дополнительное закрытие.Например, если вы вызываете это, например, в цикле, и переменная marker (или другие переменные) изменяется по циклу!Затем вам нужно заключить свой код в другое замыкание внутри цикла:

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

Замыкания - это очень хорошая и очень сильная особенность JavaScript, если вы знаете, как их использовать.Посмотрите видеоролики «Язык программирования JavaScript» от Дугласа Крокфорда, они прекрасно объясняют это.

3 голосов
/ 02 апреля 2012

Да, второе закрытие избыточно.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...