В указанном коде каждый раз, когда вы вызываете getSystemName()
, он будет связывать обработчик щелчков снова (что приводит к множественным обработчикам щелчков), а затем просто возвращает локальную переменную systemName
, которая всегда будетбыть пустым.
Если вы говорите, что каждый раз, когда вы вызываете getSystemName()
, вы хотите, чтобы он возвращал имя системы, связанное с тем, какой элемент li
был выбран последним, тогда вы можете объявить переменную systemName
какглобальная переменная и привязывает обработчик событий (один раз) за пределами getSystemName()
:
var systemName = '';
$('.pulldown li').bind('click', function(){
systemName = $(this).find('a').data('value');
console.log(systemName);
});
function getSystemName() {
return systemName;
}
Но это делает функцию довольно избыточной: вы можете просто напрямую ссылаться на глобальную переменную.
С другой стороны, вы можете объявить только функцию и использовать закрытие, чтобы избежать необходимости в глобальных переменных, что-то вроде этого:
var getSystemName = (function(){
var systemName = '';
$('.pulldown li').bind('click', function(){
systemName = $(this).find('a').data('value');
console.log(systemName);
});
return function() { return systemName };
})();
// if no items have been clicked yet it will return an empty string by default
console.log( getSystemName() ); // ""
// click on an item with name "red"
console.log( getSystemName() ); // "red"
// click on an item with name "green"
console.log( getSystemName() ); // "green"
Этот последний блок может быть немного запутанным для непосвященных,Это установка getSystemName
на все, что возвращается из выражения анонимной функции, которое выполняется немедленно (обратите внимание на дополнительные пустые скобки в конце).И что возвращается, так это простая функция, которая при вызове сама вернет systemName
, которая объявлена во внешней области видимости.Обработчик кликов также обновляет этот же systemName
.Поэтому, когда вы на самом деле вызываете getSystemName()
, вы вызываете маленькую однострочную функцию из оператора return
.