"Çalıştırılmayacak" derken, "birden fazla çağrıldığında hiçbir şey yapmayacağını" kastediyorsunuz, bir kapatma oluşturabilirsiniz:
var something = (function() {
var executed = false;
return function() {
if (!executed) {
executed = true;
// do something
}
};
})();
something(); // "do something" happens
something(); // nothing happens
@Vladloffe tarafından yapılan bir yoruma cevap olarak (şimdi silindi): Global bir değişkenle, diğer kod "çalıştırılan" bayrağın değerini (hangi adı seçerseniz seçin) sıfırlayabilir. Bir kapatma ile, başka bir kodun bunu yanlışlıkla veya kasıtlı olarak yapmasının bir yolu yoktur.
Buradaki diğer yanıtların da işaret ettiği gibi, birkaç kitaplığın ( Alt Çizgi ve Ramda gibi ) bir işlevi bağımsız değişken olarak kabul eden ve sağlanan işlevi nasıl olursa olsun tam olarak bir kez çağıran başka bir işlevi döndüren küçük bir yardımcı işlev işlevi (genellikle once()
[*] olarak adlandırılır ) vardır. çoğu kez döndürülen işlev çağrılır. Döndürülen işlev ayrıca sağlanan işlev tarafından ilk döndürülen değeri önbelleğe alır ve sonraki çağrılarda döndürür.
Bununla birlikte, böyle bir üçüncü taraf kitaplığı kullanmıyorsanız, ancak yine de böyle bir yardımcı program işlevi istiyorsanız (yukarıda sunduğum nonce çözümden ziyade), uygulanması yeterince kolaydır. Gördüğüm en güzel versiyon , David Walsh tarafından gönderilen bu versiyon :
function once(fn, context) {
var result;
return function() {
if (fn) {
result = fn.apply(context || this, arguments);
fn = null;
}
return result;
};
}
Ben değiştirmek için eğimli olacak fn = null;
etmek fn = context = null;
. Bir context
zamanlar fn
çağrılan bir referansı sürdürmek için kapatmanın bir nedeni yok .
[*] Bununla birlikte, jQuery'nin bu Drupal uzantısı gibi diğer kitaplıkların, once()
oldukça farklı bir şey yapan adlandırılmış bir işlevi olabileceğini unutmayın .