Вызов внутренней функции

#javascript

#javascript

Вопрос:

Если у меня есть:

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

тогда как мне вызвать myFunction.myInner()?

Ответ №1:

вы можете назвать это так:

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

    return myInner;
}

myFunction()();
 

В вашем примере вы создаете внутреннюю функцию, но вы должны вернуть ее, чтобы сделать ее доступной.

Комментарии:

1. это не имеет никакого смысла. Вы имели в виду myFunction()()?

Ответ №2:

Вы также можете сделать что-то вроде:

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

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

Или еще один шаблон, который я использую для имитации статических классов:

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

myFunction.myInner();
 

Комментарии:

1. Чтобы добавить, это. делает функцию myInner общедоступной функцией в объекте myFunction, где, поскольку использование var делает его закрытым (через замыкания)

2. Да, мне также нравится подход map, о котором упоминал Найнрих. Это здорово, если вам просто нужно сгруппировать кучу функций вместе. Мой способ, возможно, лучше, если вам нужны частные переменные, а методы вызывают другие методы, а что нет.

Ответ №3:

Если вы сконструировали объект немного по-другому, вы могли бы использовать:

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

myFunction.innerFunction("heyooo");
 

Это может быть не идеально, хотя в зависимости от того, чего вы пытаетесь достичь.

скрипка: http://jsfiddle.net/neilheinrich/Xjegt /

Комментарии:

1. Я думаю, что это отличный пример.

Ответ №4:

Функции — это области в JavaScript. Вы не можете вызвать функцию из функции, если не объявите ее как метод. Некоторые предполагают, что вы используете объекты или странные шаблоны, которые могут быть или не быть тем, что вы хотите…

Если вам нужна «классовая» функция с общедоступными / частными методами и переменными, сделайте это:

 //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 нет реальных классов, но проще всего описать этот шаблон как «классоподобный».

Очевидно, что вы можете добавить столько общедоступных / частных методов, объектов и т. Д., Сколько захотите.

Также обратите внимание, НЕ ЗАБЫВАЙТЕ ОПЕРАТОР «new» ПРИ СОЗДАНИИ ЭКЗЕМПЛЯРА С ЭТИМ ШАБЛОНОМ … если вы это сделаете, то «this» привязывается к вашему глобальному пространству и может переопределять другие данные приложения (конфликты имен).

Надеюсь, это поможет, удачи!

Комментарии:

1. Ну, это был очень полный ответ. Спасибо, джайор!

2. Нет проблем, рад, что смог помочь

Ответ №5:

Вы не можете. Позвольте мне перефразировать вопрос, чтобы дать представление о кошмарном мире, где можно делать то, что вы просили

 var myFunction = function() {
    for(var i=0; i<n; i  ){ ... }
}
then how do I set myFunction.i?
 

Если вы хотите получить доступ к внутренней функции, вам нужно вернуть ее или установить глобальную переменную или любую из вещей, которые вы также сделали бы, если бы это была переменная, а не функция.

Ответ №6:

В этом случае вы можете вызывать только внутреннюю функцию при выполнении кода, который находится внутри внешней функции… если вы каким-то образом не вернете внутреннюю функцию.

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