2011-07-27 132 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屬性,直到執行分配代碼,這是調用之後。