2012-07-02 19 views
19

ayarlanmadan bir işlev çağrılıp çağrılmadığı nasıl belirlenir Yapmaya çalıştığım şeyden uzaklaşmak için iyi bir teknik arıyorum: global bir değişken ayarlamak için.Genel değişken

Birisi bir düğmeyi tıklatarak bir işlevi ilk kez çalıştırdığında, birkaç şeyi sürüklenebilir hale getirmek için başlangıç ​​işlevini tetikler. Daha sonra, düğmeye ikinci kez tıklarlarsa, init işlevinin başlatılıp başlatılmadığını ve yeniden adlandırılmaması gerektiğini belirlemek istiyorum. Bunu, init işlevinden global bir değişken ayarlayarak ve sonra bu değişkeni tıklama işlevinden kontrol ederek kolayca yapabilirim, ancak genel değişken oluşturmadan bunu nasıl yapacağınızı merak ediyorum. Bunu yapmanın bir yolunu gerçekten çok isterim.

cevap

21

Sen işleve bir özellik ekleyebilirsiniz:

function init() { 
    init.called = true; 
} 

init(); 

if(init.called) { 
    //stuff 
} 
2

Neden sadece Draggables onlara draggable bir sınıf var olmadığını görmek için kontrol etmiyorsunuz?

if ($('.mydiv').is('.draggable')) { 
    //do something 
} 
+0

Teşekkür! kullanarak sona erdi! henüz sürüklenmemiş olup olmadığını kontrol etmek için gerekli olan temel çözümdür. – codelove

+1

yup, sorun değil. eğer kullandığın buysa, neden kabul edildiği gibi seçmedin? : D – Jason

+0

Bunu kullanarak kullanmayı denedim! ama bir sebepten ötürü her zaman sürüklenemez olarak kaydediliyordu ... bu yüzden Levi'nin çözümüne gittim .. Maalesef aralarından seçim yapabileceğiniz pek çok yöntem vardı! – codelove

15

Levi'nin cevabının sadece iyi çalışması gerekirken, başka bir seçenek sunmak istiyorum. Bir kez çağrıldıktan sonra hiçbir şey yapmamak için init fonksiyonunu yazarsınız.

var init = function() { 
    // do the initializing 

    init = function() { 
     return false; 
    } 
}; 

İlk defa çağrıldığında bu işlev init yapar. Daha sonra, bir dahaki sefere yanlış olarak geri dönmek için hemen üzerine yazacaktır. Fonksiyon ikinci kez çağrıldığında, fonksiyon gövdesi sadece geri dönüşü içermelidir. Daha fazla okuma için

: http://www.ericfeminella.com/blog/2011/11/19/function-overwriting-in-javascript/

+0

Bu akıllı, Jason'ın sadeliği için cevabını kullanacağım. Gelecekte bu tekniği kesinlikle kullanacağım – codelove

+0

Bu çok hoş bir teknik olan – Jason

1

Ne yapabilirdi prototipten başlat işlevini çöz olduğunu.

​var Obj = function() { 
    this.init = function() { 
     document.write("init called<br/>"); 
     this.init = null; 
    } 
} 
var o = new Obj(); 
if (o.init) document.write("exists!<br/>"); 
o.init(); 
if (o.init) document.write("exists!<br/>"); 
o.init(); 

ilk if

doğru ve exists! yazdırmak ancak işlevi kendisini kaldırır, çünkü ikinci if başarısız olacaktır. Benim örnekte, hiçbir şey olmaz olduğunu göstermek için koşulsuz sadece ikinci init diyoruz, ama tabii ki bunu var olduğu takdirde diyebiliriz: Bu Jason için

if (o.init) o.init(); 

http://jsfiddle.net/coreyog/Wd3Q2/

+0

vay bu işe çok fazla çözüm var! hangi rotanın yapılacağını belirlemek zordur, lol – codelove

+0

Birçok kalite çözümü vardır. Benimkinde 'init' tekrar çağrılmayı başaramadığımızı belirtmek gerekir.Bu kişilerin çoğu, bazı değişkenlerin kontrol edilmesini gerektirir ve eğer siz kontrol etmezseniz, yine de onu arayabilirsiniz. –

2
Function.prototype.fired = false; 

function myfunc() { 
    myfunc.fired = true; 
    // your stuff 
}; 

console.log(myfunc.fired) // false 

myfunc(); 

console.log(myfunc.fired) // true