İçsel bir işlevi çağırmak

Sahip olursam:

var myFunction = function() {
    var myInner = function() {
    }
}

o zaman myFunction.myInner() öğesini nasıl ararım?

1

6 cevap

Şunun gibi bir şey de yapabilirsiniz:

var myFunction = function() {
   this.myInner = function() {
     //...
   }
}

var foo = new myFunction();
foo.myInner();

Ya da statik sınıfları taklit etmek için kullandığım başka bir desen:

var myFunction = new function() {
   this.myInner = function() {
     //...
   }
};

myFunction.myInner();
3
katma
Evet, ayrıca nheinrich'in de bahsettiği harita yaklaşımını seviyorum. Bir grup işlevi bir arada gruplandırmanız gerekiyorsa harikadır. Özel değişkenlere ve yöntemlere ihtiyaç duyduğunuzda başka yöntemlere başvurmanız gerekirse, belki de daha iyiyim.
katma yazar Mike Christensen, kaynak
Bunu eklemek için. myInner işlevini myFunction nesnesinde herkes tarafından erişilebilir bir işleve dönüştürür;
katma yazar Matt, kaynak

bu şekilde diyebilirsiniz:

var myFunction = function() {
    var myInner = function() {}

    return myInner;
}

myFunction()();

Örneğinizde, içsel işlevi yaratıyorsunuz, ancak onu erişilebilir hale getirmek için geri göndermeniz gerekiyor.

3
katma
kötü teşekkür ederim.
katma yazar kemiller2002, kaynak
Bu hiç mantıklı değil. Bunu mu demek istediniz benimFunction() ()?
katma yazar Esailija, kaynak

Eğer nesneyi biraz farklı bir şekilde oluşturursanız şunları kullanabilirsiniz:

var myFunction = {
  innerFunction: function(txt){
    alert(txt);
  }    
}

myFunction.innerFunction("heyooo");

Bu, elde etmeye çalıştığınız şeye bağlı olarak ideal olmayabilir.

fiddle: http://jsfiddle.net/neilheinrich/Xjegt/

2
katma
Bunun harika bir örnek olduğunu düşünüyorum.
katma yazar Phillip Senn, kaynak

Yapamazsın. İstediğin şeyi yapmanın mümkün olduğu kabus dünyasına bir göz atmak için bir soru sormama izin ver

var myFunction = function() {
    for(var i=0; i

İçsel işleve erişmek istiyorsanız, onu geri döndürmeniz veya global bir değişken veya bir işlev yerine bir değişken olsaydı yapmanız gerekenleri ayarlamanız gerekir.

1
katma

İşlevler, JavaScript'te kapsamlarıdır. Bir yöntem olarak bildirmediğiniz sürece, bir işlev içinden bir işlevi çağıramazsınız. Bazıları, ne istediğinizi ya da istemediğiniz nesneleri ya da tuhaf kalıpları kullanmanızı önerdi ...

Genel/özel yöntem ve değişkenlerle "sınıf gibi" bir işlev istiyorsanız, şunu yapın:

//Declare your "class"
function Foo(specs) {

    //Can do whatever you want with specs
    //jQuery uses it to initialize plugin data ;)

    //These are examples of private variables
    var a = 1;
    var b = "b";

    //These are examples of public variables
    this.aa = 1;
    this.bb = "b";

    //This is a private method
    function Bar_Private(p0,p1) {...}

    //This is a public method
    this.Bar_Public = function(p0,p1) {...}

}

//Now to use it....
//Create an instance
var myInstance = new Foo();

//Using it
alert(myInstance.a);    //Reference Error
alert(myInstance.aa);   //Alerts 1

myInstance.Bar_Private(0,1);  //Reference Error
myInstance.Bar_Public(0,1);   //Calls Bar_Public with 0 and 1 as params

JavaScript'in gerçek sınıfları yoktur, ancak bu modeli "sınıf gibi" olarak tanımlamak en kolay yoldur.

Açıkçası, istediğiniz kadar çok sayıda kamu/özel yöntem, nesne vb. Ekleyebilirsiniz.

Ayrıca, bu model ile bir yapı oluşturduğunuzda “yeni” OPERATÖR UNUTMAYINIZ. Bunu yaparsanız, “bu” global alanınıza bağlıdır ve diğer uygulama verilerini (isim çarpışmaları) geçersiz kılabilir.

Umarım bu yardımcı olur, iyi şanslar!

1
katma
Eh, bu çok eksiksiz bir cevaptı. Teşekkürler jyore!
katma yazar Phillip Senn, kaynak
Sorun değil, yardımcı olabileceğime sevindim
katma yazar jyore, kaynak

Bu durumda, iç işlevi bir şekilde döndürmediğiniz sürece, dış fonksiyonu ... içindeki kodu çalıştırırken sadece içsel işlevi çağırabilirsiniz.

var myFunction = function() {
    var myInner = function() {
    }
   //you can call it here
    myInner();
}
0
katma