2011-07-27 62 views
0

执行内部函数,我想执行的内部功能,但我很努力理解为什么回来为未定义通过返回函数名

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(); 
    } 

} 

回答

1

因为它被声明innerFunction仅在方法2知在方法2的范围内。 如果你想访问method1,你可以在这里声明innerFunction: this.innnerFunction = function(){},这样就可以调用object.innerFunction()

如果你不希望暴露innerFunction为对象的公共方法,你可能要使用闭合:

function doObject(){ 
function innerFunction(){alert('yihou');} 
return { 
    method1:function(){innerFunction();}, 
    method2:function(){} 
}; 
} 
+0

+1代码示例 – Tom

3

JavaScript有词法作用域---代码只能看到其范围内声明的变量(函数)或语法树上的任何祖先范围。由于innerFunctionmethod2的范围内声明,并且method2在句法上不是method1的祖先,所以不能使用它。

+0

+1用于完全回答被问到的问题 – Tom

1

你的任务也不对,我想。取而代之:

executeInnerFunction = object.method1; 

您想要存储对方法的引用,而不是调用方法的一次结果。看看ngn不得不说的。

0

其他人已经回答了范围问题,但您也尝试在存在前调用object.method2() 。之前执行的代码,所以你可以调用声明函数上涨的代码比写在那里,但是object.method2被分配创建

函数声明进行处理,所以对象没有方法2属性,直到执行分配代码,这是调用之后。