2014-12-11 87 views
1

我试图在javascript中实现一个经典模块模式,讨论herehere。但我的私人方法不起作用。我有以下的测试代码。模块模式中的私有方法:TypeError:undefined不是函数

var jsStuff = (function() { 

    // Private 
    var sayStuffPrivate = function (stuff) { 
     console.log("I am a private method: " + stuff); 
     return true; 
    }; 

    // Public 
    return { 
     sayStuff: function (stuff) { 
      console.log("I am a public method: " + stuff); 
      this.sayStuffPrivate(stuff); 
      return true; 
     } 
    } 
}()); 

当我尝试运行此,我得到如下:

> jsStuff.sayStuff('blah'); 
test.js:16 I am a public method: blah 
test.js:17 Uncaught TypeError: undefined is not a function 

缺少什么我在这里?

+0

这不是一种方法,因为这意味着它不再是私人的。这只是一个本地功能,应该这样访问;而不是通过'this.'像你的对象的公共属性。 – Bergi 2014-12-11 06:06:54

+0

请注意,函数内* this *的值完全取决于您如何调用函数(或通过使用* bind *),而非词汇(或函数的创建方式)。 – RobG 2014-12-11 06:17:08

回答

3
this.sayStuffPrivate(stuff); 

这里,this指的是你真正从sayStuff函数返回的对象。那里没有名为sayStuffPrivate的房产。因此,this.sayStuffPrivate将被评估为undefined并且由于您正在使用它作为函数,因此会失败并显示该错误。

你应该采取封闭性的优势,并调用它像这样

sayStuffPrivate(stuff); 
+0

谢谢!我对js很陌生,看起来很微妙。很明显,我想,一旦你看过几次。 – Dave 2014-12-11 06:14:28

+1

@Dave这是真的,我已经看过这么多次:-) – thefourtheye 2014-12-11 06:16:04

+0

顺便说一句,私人方法可以调用公共方法吗?如果是这样,怎么样? – Dave 2014-12-11 06:29:29

0

你应该叫sayStuffPrivate没有这个。试试这个:

var jsStuff = (function() { 

    // Private 
    var sayStuffPrivate = function (stuff) { 
     console.log("I am a private method: " + stuff); 
     return true; 
    }; 

    // Public 
    return { 
     sayStuff: function (stuff) { 
      console.log("I am a public method: " + stuff); 
      sayStuffPrivate(stuff); 
      return true; 
     } 
    } 
}()); 
相关问题