2014-12-11 89 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; 
     } 
    } 
}()); 
相關問題