2010-07-26 26 views
11

ile çağrıldıi bir JavaScript işlevi vardır javascript

nasıl kontrol edileceğini

işlev çağrıldı o zaman

fonksiyonu IF_FUNCTION demiyorlar (<head></head> bölümünde bu fonksiyonu var) Daha sonra php ile fonksiyon Require_oncenin veya include_once gibi

çağrı (<head></head> bölümünde değil bu işlevi var) çağrılmadı

yardım bana javascript fonksiyonları üyeleri ve özelliklere sahip olabilir nesnelerdir olarak, başarmak kolaydır teşekkür

+0

olası yinelenen http://stackoverflow.com/questions/280389/how-do-you-find-out-the-caller-function -in-javascript) – Ralgha

cevap

24

İki seçenek:

Statik değişkenler İşte kapanması da statik değişkenleri saklamak için fonksiyonları çağıran kendini kullanılarak değişkenler (C gibi) statik oluşturmak için nasıl. çalışmaya başladıktan sonra

var myFun = (function() { 
    var called = false; 
    return function() { 
    if (!called) { 
     console.log("I've been called"); 
     called = true; 
    } 
    } 
})() 

Boş Fonksiyon yedek boş işleve işlevini ayarlayın.

function callonce() { 
    console.log("I've been called"); 
    arguments.callee = function() {}; 
} 

Özet fikri Burada sadece bir kere çağrılır bir işlev, her fonksiyona kazan plaka kodunu ekleme konusunda endişelenmenize gerek yok bu şekilde döndüren bir fonksiyondur.

function makeSingleCallFun(fun) { 
    var called = false; 
    return function() { 
    if (!called) { 
     called = true; 
     return fun.apply(this, arguments); 
    } 
    } 
} 

// Alternate implementation 
function makeSingleCallFun(fun) { 
    return function() { 
     return fun.apply(this, arguments); 
     arguments.callee = function() {}; 
    } 
} 

var myFun = makeSingleCallFun(function() { 
    console.log("I've been called"); 
}); 
myFun(); // logs I've been called 
myFun(); // Does nothing 
[JavaScript'te arayan işlevini öğrenmek nasıl?] Arasında (
+0

Bunu kimin kandığı? +1 den dengelemek için –

+0

@SeanPatrickFloyd Başlangıcında 'callee'' adı verilen işlev adıyla ilgili bir yazım hatası olduğunu düşündüm, fakat bu bir değişkendir ve eşleşiyor, bu yüzden neden düşük olduğunu bilmiyorum. Yorum yapmadan önce kodu denediniz mi? – erm3nda

+3

@ erm3nda hiçbir fikir. bu 4 yıl önceydi –

3
var called = false; 
function blah() { 
    called = true; 
} 

if (!called) { 
    blah(); 
} 
+1

Küresel-değişken-naziler için [bu küresel kapsamda olduğu için], blah'ın zaten tanımlanmış olduğunu varsayarak, blah.called öğesini kullanabilirsiniz. Yine de bu kod benim için yeterince güzel. – Warty

+0

Bu desenin dezavantajı, işlev çağrısının, çağrıldığı her yerde bir koşullu bildirimde sarmanız gerektiğidir. –

+0

@ItzWarty Bu, Török Gábor'un belirttiği gibi benim için yeterli değil.Globals'ın kötü olmasının bir sebebi var, bu yüzden onlardan vebadan kaçınıyorum, bana küresel bir nazi de! Burada bir global değişken kullanmayan ve aramayı her yerde koşullu bir koşulla sarma gerektirmeyen birçok örnek var. Bu, –

4

:

var callMeOnlyOnce=function(){ 

    if(this.alreadyCalled)return; 

    alert('calling for the first time'); 

    this.alreadyCalled=true; 
}; 

// alert box comes 
callMeOnlyOnce(); 


// no alert box 
callMeOnlyOnce(); 

DÜZENLEME:

olarak doğru işaret

CMS tarafından, bunu kullanmak o kadar kolay değil. Bunun yerine, bunun yerine özel bir ad alanı kullanan gözden geçirilmiş bir sürüm.

if(!window.mynamespace){ 
    window.mynamespace={}; 
} 

mynamespace.callMeOnlyOnce=function(){ 

    if(mynamespace.alreadyCalled)return; 

    alert('calling for the first time'); 
    mynamespace.alreadyCalled=true; 
}; 

// alert box comes 
mynamespace.callMeOnlyOnce(); 


// no alert box 
mynamespace.callMeOnlyOnce(); 
+1

olarak adlandırılıyor. "Bu" değeri, işlevin değil Global nesnesini ifade eder ve "allreadyCalled" ibaresi Global nesnenin bir özelliği olmaktan çıkar. Bunun nedeni, işlevin bir temel nesneye sahip olmayan bir başvurudan çağrılmasıdır: 'callMeOnlyOnce();'. [Bu 'hakkında daha fazla bilgi] (http://stackoverflow.com/questions/3320677/this-operator-in-javascript/3320706#3320706) – CMS

10

Dekoratör kalıbını kullanın.

// your function definition 
function yourFunction() {} 

// decorator 
function callItOnce(fn) { 
    var called = false; 
    return function() { 
     if (!called) { 
      called = true; 
      return fn(); 
     } 
     return; 
    } 
} 

yourFunction(); // it runs 
yourFunction(); // it runs  
yourFunction = callItOnce(yourFunction); 
yourFunction(); // it runs 
yourFunction(); // null 

Bu çözüm, hedefinize ulaşmak için ücretsiz bir yan yol sağlar. Orijinal işlevinizi değiştirmek zorunda değilsiniz. Kütüphane fonksiyonları ile bile güzel çalışıyor. Orijinal işlevi korumak için dekore edilmiş işleve yeni bir ad atayabilirsiniz.

var myLibraryFunction = callItOnce(libraryFunction); 
myLibraryFunction(); // it runs 
myLibraryFunction(); // null 
libraryFunction(); // it runs 
+0

Oh hayır, cevabınızı atladım ve neredeyse bir cevap ekledim aynı. Ben de farklı bir yol gösterdiğim için cevabımı bırakacağım. Ancak, bu nasıl dekoratör kalıbı? Bence bu daha çok yönelimli programlama gibi. –

+0

@Juan İkiniz de haklısınız, AOP sık sık dekoratör kalıbını kullanır –

0
If (!your_func.called) { 
    your_func.called = true; 
    your_func(); 
} 
+0

Tüm cevapların dışında, bu kodun en fazla tekrarlanmasını gerektiren şeydir. Her aramanın bayrağı ayarlaması ve koşullu olarak sarılması gerekir. –