2015-10-07 88 views
0

我有一個函數調用哪個返回參考對象文字nameObj。我想訪問返回的對象中的方法,但我得到js錯誤。爲什麼setNameObj方法在nameObj對象上不可用?瞭解js返回類型

 var nameObj=function(){ 

      var _locname; 

      return { 
       item:'item1', 
       getNameObj: function(){ 
        return _locname 
       }, 
       setNameObj: function(nm){ 
        _locname = nm 
       } 
      } 
     } 
     console.log(nameObj.setNameObj('tempValue')); 
     console.log(nameObj.getNameObj()); 
+0

因爲'nameObj'是一個功能 –

回答

2

因爲您將nameObj設置爲功能而不是該功能的結果。它看起來像你想在這裏的IIFE,所以就在你的函數表達式的末尾加上括號:

 var nameObj=function(){ 
 

 
      var _locname; 
 

 
      return { 
 
       item:'item1', 
 
       getNameObj: function(){ 
 
        return _locname 
 
       }, 
 
       setNameObj: function(nm){ 
 
        _locname = nm 
 
       } 
 
      } 
 
     }(); 
 
     console.log(nameObj.setNameObj('tempValue')); 
 
     console.log(nameObj.getNameObj());

+1

那就是我想做的事,忘了讓它變成IIFE :-) – tintin

6

因爲nameObj是一個函數返回一個對象,將有你的方法!

嘗試調用它然後在結果上調用函數:

console.log(nameObj().setNameObj('tempValue')); 
console.log(nameObj().getNameObj()); 

當然在這種情況下,它還很有爭議中,因爲每次調用將創建一個新的閉包。你最可能想要一個變量(或者只是將nameObj轉換爲IIFE)。

var obj = nameObj(); 
obj.setNameObj('tempValue'); 
console.log(obj.getNameObj()); 
+0

感謝您的解釋! – tintin

+1

不要指望第一個日誌記錄任何實際的東西。由於setNameObj沒有返回值,因此它將記錄未定義。 – 100r

+0

@ 100r好的。我編輯了我的代碼以反映這一點。 –

0

由於nameObj是一個函數,你必須把括號後,他們評估: nameObj()

0

你可能想要的是這樣的:

var nameObj= (function(){ 

     var _locname; 

     return { 
      item:'item1', 
      getNameObj: function(){ 
       return _locname 
      }, 
      setNameObj: function(nm){ 
       _locname = nm 
      } 
     } 
    })(); 
    console.log(nameObj.setNameObj('tempValue')); 
    console.log(nameObj.getNameObj()); 

注意加括號(兩組)圍繞nameObj定義。獲取函數和獲取函數的結果之間存在明顯的區別。