Закрытия в JavaScript - PullRequest
       1

Закрытия в JavaScript

0 голосов
/ 03 июля 2010

У меня есть такой код, где я пытаюсь добавить обработчик событий для какой-нибудь кнопки.Я хотел бы использовать глобальную переменную и сохранить ее текущее значение в закрытии обратного вызова, а не ее ссылку.

var globalNum="dummy";
function A()
{
  $("#button").click(function()
  {
     $("#button").append(globalNum);
  });
}

globalNum="dummyAgain";

Теперь, если будет запущено событие click, что будет добавлено - "dummy" или "dummyAgain"?Я полагаю, что это будет "dummyAgain", потому что ссылка закрытия глобальной переменной хранится.Я хочу, чтобы ценность связывала.Я знаю, что могу создать локальную переменную внутри A, которую я могу инициализировать с помощью глобальной переменной и связать ее, но есть ли и другие более крутые способы?

Спасибо

Ответы [ 2 ]

7 голосов
/ 03 июля 2010

Вы правы, к нему добавится dummyAgain .Вы можете справиться с этим с помощью bind() и отправить некоторые данные о событии:

var globalNum="dummy";
(function A()
{
  $("#button").bind('click', {localNum: globalNum}, function(e)
  {
     $("#button").append(e.data.localNum);
  });
})();

globalNum="dummyAgain";

Обратите внимание, что я немедленно выполняю функцию A, поэтому обработчик щелчков присоединяется до значение globalNum изменяется.Как отмечает @Andrew в своем комментарии, это тот же эффект, что и вовсе не использовать функцию «обтекания» A.


То же решение без bind:

(function()
 {
  var localNum = globalNum;
  $("#button").click(function()
  {
     $("#button").append(localNum);
  });
})();

Здесь анонимная функция полезна для захвата текущего значения globalNum в локальной переменной.


Обновление:

Радиполнота (я надеюсь, @Andrew, вы не возражаете, что я разместил это здесь).«Самый крутой» способ, вероятно, состоит в том, чтобы использовать параметр для функции и немедленно выполнить функцию с этим параметром:

var globalNum="dummy";

(function(globalNum)
 {
  $("#button").click(function()
  {
     $("#button").append(globalNum);
  });
})(globalNum);

globalNum="dummyAgain";

«Уловка» заключается в том, что имя параметра и имя глобальной переменнойодинаковы.

Это также очень часто используется для ссылки на некоторый объект с более коротким идентификатором без загрязнения глобального пространства имен, например, с помощью jQuery:

(function($) {
    // jQuery == $
})(jQuery)
0 голосов
/ 03 июля 2010

Может быть, есть какой-то более крутой способ, но объявление локальной переменной внутри A - самый простой и прямой способ, следовательно, лучший.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...