2014-10-02 83 views
1

嘿,從另一個運行一個函數有點困惑。我曾嘗試是:從javascript中的其他函數執行另一個函數

var a = (function() { 
    var babe = function() { 
     console.log('yay'); 
    }; 
})(); 

當我運行像a.babe()代碼它給我的錯誤一樣TypeError: Cannot read property 'babe' of undefined。爲什麼會發生這樣的事情?

我想從a調用函數babe ...我該怎麼做? 我希望你們能幫助我...

在此先感謝。

回答

3

您正在創建一個名爲babe功能,它僅停留周圍的立即調用函數表達式(IIFE)的範圍之內。由於您沒有將任何內容返回給調用者,因此默認情況下,函數調用將評估爲undefined,並將存儲在a中。這就是爲什麼你所得到的錯誤,

TypeError: Cannot read property 'babe' of undefined 

這意味着,您要訪問的undefined值稱爲babe屬性。在這種情況下,aundefined

代替這一切,你可以簡單地返回從IIFE的babe功能,包裹在一個對象,這樣

var a = (function() { 
    return { 
     babe: function() { 
      console.log('yay'); 
     } 
    }; 
})() 

現在,返回的對象被分配到a,你可以調用babe功能像這樣

a.babe(); 
0

babe是該代碼中的IIFE的局部變量。它不返回。它不是任何東西的財產。它無法訪問。

如果你想從外部調用它,你必須公開地公開它。


var a = (function() { 
     var babe = function() { 
      console.log('yay'); 
     } 
     return babe; 
    })(); 

    a(); 

var a = (function() { 
     var babe = function() { 
      console.log('yay'); 
     } 
     return { 
      "babe": babe 
     }; 
    })(); 

    a.babe(); 
0

你爲什麼做了自動執行功能?你想要做的就是讓一個函數的對象a爲的babe一部分,只需做到這一點:

var a = { 
 
    babe: function() {document.write('yay');} 
 
} 
 

 
a.babe();

。我有一個對象a和附加功能babe內它..然後使用點符號訪問對象內的功能a

0

要使用您的代碼,您必須執行

var a = (function() { 
    var babe = function() { console.log('yay'); } 
    return babe 
})(); 

a(); 

要使它a.babe()看看@thefourtheye或@Quentin。

0

點語法用於訪問對象的「屬性」。因此,在一個簡單的例子,你可以使用類似:

var a = { 
    babe: function(){ console.log('yay') } 
}; 

a.babe(); // yay 

在您的例子的情況下,如果你想創建一個封閉隱藏在全局範圍內的其他變量和函數,你必須返回然後,將獲得分配給a對象:

var a = (function() { 
    return { 
     babe: function(){ console.log('yay') } 
    } 
})(); 

a.babe(); // yay 

記住,任何時候你使用點,前面的變量是一個對象。

相關問題