Каковы подводные камни при добавлении свойств к объекту функции внутри функции? - PullRequest
3 голосов
/ 29 сентября 2011

Я обнаружил, что могу использовать эту технику для сохранения своего рода "состояния" в обработчике событий, без необходимости использования внешних переменных ...

Я считаю, что эта техника очень умна в использованиитот факт, что функции на самом деле являются объектами сами по себе, но я обеспокоен тем, что я делаю что-то, что может иметь какие-то негативные последствия ...

Пример ...

var element = document.getElementById('button');

element.onclick = function funcName() {
    // attaching properties to the internally named "funcName"
    funcName.count = funcName.count || 0;
    funcName.count++;

    if (self.count === 3) {
        // do something every third time
        alert("Third time's the charm!");
        //reset counter
        funcName.count = 0;
    }
};

1 Ответ

5 голосов
/ 29 сентября 2011

Вместо этого вы можете использовать замыкание:

element.onclick = (function() {
  var count = 0;
  return function(ev) {
    count++;
    if (count === 3) {
      alert("3");
      count = 0;
    }
  };
})();

Эта установка включает анонимную функцию, которую код немедленно вызывает. У этой функции есть локальная переменная count, которая будет сохранена в последовательности вызовов обработчиков событий.

Кстати, это:

var something = function dangerous() { ... };

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

...