Якщо під "не буде виконано" ви маєте на увазі "нічого не зробить, коли дзвонить більше одного разу", ви можете створити закриття:
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()
що робить щось зовсім інше.