Если под «не будет выполняться» вы имеете в виду «ничего не будет делать при вызове более одного раза», вы можете создать закрытие:
var something = (function() {
var executed = false;
return function() {
if (!executed) {
executed = true;
// do something
}
};
})();
something(); // "do something" happens
something(); // nothing happens
В ответ на комментарий @Vladloffe (теперь удален): с помощью глобальной переменной другой код может сбросить значение флага «выполнено» (какое бы имя вы для него не выбрали). С закрытием другой код не имеет возможности сделать это случайно или намеренно.
Как указывают другие ответы здесь, несколько библиотек (таких как Underscore и Ramda ) имеют небольшую служебную функцию (обычно называемую once()
[*] ), которая принимает функцию в качестве аргумента и возвращает другую функцию, которая вызывает предоставленную функцию ровно один раз, независимо от того, как много раз вызывается возвращаемая функция. Возвращенная функция также кэширует значение, которое сначала возвращает предоставленная функция, и возвращает его при последующих вызовах.
Однако, если вы не используете такую стороннюю библиотеку, но все же хотите такую служебную функцию (а не одноразовое решение, которое я предложил выше), ее достаточно легко реализовать. Самая красивая версия, которую я видел, - это опубликованная Дэвидом Уолшем :
function once(fn, context) {
var result;
return function() {
if (fn) {
result = fn.apply(context || this, arguments);
fn = null;
}
return result;
};
}
Я был бы склонен перейти fn = null;
на fn = context = null;
. Нет причин для закрытия, чтобы поддерживать ссылку на context
один раз fn
.
[*] Однако имейте в виду, что другие библиотеки, такие как это расширение Drupal для jQuery , могут иметь функцию с именем, once()
которая выполняет совсем другие функции.