2017-05-12 71 views
0

我是一個javascript新手,並試圖瞭解功能如何工作。我發現了一個類似的問題here,但它並沒有真正回答我的問題。爲什麼我需要返回「init」來執行init函數?

以下面片的javascript爲例

var test = function(){ 
    console.log("kick off"); 
    var insideTest = "variable inside test"; 
    var init = function(){ 
    var insideInit ="variable inside init"; 
    console.log("inside init"); 
    } 
    return{ 
    init:init 
    } 
} 

test().init(); 

上述代碼打印如下:

kick off 
inside init 

但是如果刪除

return{ 
init:init 
} 

它給我一個錯誤說

Uncaught TypeError: Cannot read property 'init' of undefined

此外,即使我使用test().init()調用init方法,但如果刪除了return語句,則不打印inside Init

我的問題是爲什麼有必要返回init:init來執行init方法。

編輯: 要回答爲什麼我的初始化函數是測試()函數中這裏是我想要做的大局。

var test = function() { 
    var init = function() { 
    var a = 0; 
    function1(); 
    function2(); 
    } 

    var function1() = function() { 
    //some code 
    } 

    var function1() = function() { 
    //some code 
    } 

    return { 
    init: init 
    } 
} 
+1

因爲如果你什麼也不返回,然後調用'測試()的結果是''undefined'它沒有所謂的'init'方法 –

+1

你也可以'返回init',然後調用返回的函數'test()()'。或者,'var init = test(); init();' – guest271314

+0

'即使我使用test()。init()它不會在Init'內部打印時調用init方法 - 因爲如果你不返回任何東西,你根本不會調用init –

回答

1

已添加內嵌評論。 test中的init也將有權訪問在其之外(init)範圍內定義的變量,該變量是關閉的。 test是返回一個對象來訪問它的內部功能。本特定的模式是revealing module pattern

var test = function(){ 
    console.log("kick off"); 
    var insideTest = "variable inside test"; 
    // Here init is a function which is private to test function 
    // Any function calling test will not have access to init unless it is 'exposed' 
    var init = function(){ 
    var insideInit ="variable inside init"; 
    console.log("inside init"); 
    } 
    return{ 
    init:init // exposing the private function 
    } 
} 
+0

謝謝@brk,這很清楚。 – md1hunox

1

當您返回時,你用的init一個鍵,您分配了您在測試函數中定義的「初始化」函數返回一個對象。這可以讓你根據需要返回多個功能,這樣你就可以鎖定呼叫。

如果你更喜歡不同的方式,你可以返回沒有花括號的函數,即。 return init;,然後將test()的返回分配給一個變量。 var externalInitFnc = test();

編輯:回想起來,你似乎對Javascript中的範圍思想模糊不清。當您在test函數中定義init時,它只能在該函數內進行訪問。類似於Java類中的私有變量只能在同一個類中使用。

+0

是的,範圍現在對我來說有點模糊。此外,這是我基於我正在處理的更大代碼創建的代碼片段。該代碼如下所示:https://jsfiddle.net/49pf1a6w/ – md1hunox

相關問題