Выполнение внутренней функции путем возврата имени функции - PullRequest
0 голосов
/ 28 июля 2011

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

object.method2();

var object = {
    method1 : function(){
        return function(){
            innerFunction();
        }
    },

    method2 : function(){
        function innerFunction(){
            alert('I am showing as not defined but I want to be executed')
        }

        executeInnerFunction = object.method1()
        executeInnerFunction();
    }   

}

Ответы [ 4 ]

3 голосов
/ 28 июля 2011

JavaScript имеет лексический scoping --- код может видеть только переменные, объявленные в его области (функции) или любой области предка в синтаксическом дереве. Поскольку innerFunction объявлено в области действия method2, а method2 синтаксически не является предком method1, вы не можете его использовать.

1 голос
/ 28 июля 2011

Ваше задание тоже не правильно, я думаю.Сделайте это вместо этого:

executeInnerFunction = object.method1;

Вы хотите сохранить ссылку на метод, а не результаты одного вызова метода.

Помимо этого, посмотрите, что сказал ngn.

1 голос
/ 28 июля 2011

innerFunction известна только в method2, поскольку она объявлена ​​в области действия method2.Если вы хотите получить доступ из method1, вы можете объявить innerFunction через это: this.innnerFunction = function(){}, чтобы можно было вызывать object.innerFunction().

Если вы не хотите показывать innerFunction как открытый метод объекта, который выможет захотеть использовать замыкание:

function doObject(){
 function innerFunction(){alert('yihou');}
 return {
  method1:function(){innerFunction();},
  method2:function(){}
 };
}
0 голосов
/ 28 июля 2011

Другие ответили на проблему с областью действия, но вы также пытаетесь вызвать object.method2() до того, как она существует.

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

...