2010-07-03 2 views
0

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

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

globalNum="dummyAgain"; 

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

Благодаря

ответ

7

Вы правы, это будет добавить 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 в локальной переменной.


Update:

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

var globalNum="dummy"; 

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

globalNum="dummyAgain"; 

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

Это также очень часто используется для обозначения какого-либо объекта с более коротким идентификатором без загрязнения глобального пространства имен, например. с JQuery:

(function($) { 
    // jQuery == $ 
})(jQuery) 
+1

+1 ответ. Следует отметить, что @Felix_Kling использует использование 'bind()', но также вызывает 'A()' перед обновлением 'globalNum'. Это будет эквивалент, я думаю, об удалении оболочки функции A() 'и непосредственного выполнения содержимого. – Andrew

+0

Спасибо. Но я не хочу создавать локальные данные - по крайней мере, явно. В противном случае я мог бы просто определить localNum = globalNum в теле A и добавленном localNum при закрытии функции обратного вызова. Не то, что создание локальных данных имеет некоторые проблемы, я просто ищу более прохладный материал :) –

+3

Затем используйте ответ @Felix Kling с одним незначительным изменением.Измените 'function A()' на 'функцию A (globalParam)' и вызовите его в конце с помощью '}) (globalParam);' Обратите внимание, что 'globalParam' внутри функции будет отличаться от' globalParam' снаружи. – Andrew

0

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

Смежные вопросы