2015-10-07 51 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定义。获取函数和获取函数的结果之间存在明显的区别。