2012-07-16 148 views
0

我不熟悉js設計模式。現在我進入了一個問題。希望你們能幫助我。先謝謝了。JavaScript設計模式,功能被覆蓋

代碼是在這裏:http://jsfiddle.net/nNdna/ 活頁是在這裏:http://www.sumsy.com/demos/socialFeeds/

請到直播頁面,並檢查你的調試器。你應該看到「pinterest init」出現在日誌中。但我期待「twitter init」會出現在日誌中,因爲我從主函數調用Twitter.init。

MY設置爲: 有2個匿名自我執行功能,內部

var Twitter = (function($, window){ ... init = function ... 
var Pinterest = (function($, window){ ... init = function ... 

然後從我的主要功能,我打電話Twitter.init(user_twitter_options)均具有初始化函數;

但似乎Pinterest.init實際上被調用。 它看起來像Pinterest.init覆蓋了Twitter.init函數。

任何人都可以告訴我什麼是錯的?我不應該有2匿名自執行功能?

謝謝先進。

+2

您的「代碼」鏈接只是將我們帶到一個空白的jsfiddle。 – Domenic 2012-07-16 02:04:14

+0

它鏈接到JSFiddle主頁,更加精確。 – 2012-07-16 02:05:55

+0

對不起。我的錯。現在修復了 – 2012-07-16 02:08:03

回答

3

小提琴中的代碼有很多問題。

兩個TwitterPinterest被分配到調用返回this其中this將等於window,因爲你不是實際上new創建新的對象或以其他方式做任何設置this的東西匿名函數的結果。

在這兩個匿名函數中,您分配init = ...而不聲明它與var這意味着init將是一個全局變量。因此,Pinterest部分中的代碼將覆蓋最初在Twitter部分創建的全局init

鑑於全局基本上是window對象的屬性和TwitterPinterest均分配給window也就是說在調用二者Twitter.init()Pinterest.init()是與調用window.init()。所以這就是爲什麼他們都做同樣的事情。

不幸的是你的代碼太長,我去通過提供一個工作版本,所以我建議你讀一些或所有這些引用的:

+0

感謝您的鏈接。我通過引用該頁面上的模塊導出示例解決了該問題。謝謝! – 2012-07-16 02:36:46

1

您需要在init前添加var,否則您將其放在全局範圍內。這意味着init將等於上次分配,在這種情況下是Pinterest版本。

+0

,但是如果我將var添加到init。它會給我一個錯誤Twitter.init不是一個函數,當我調用Twitter.init(user_twitter_options);從主函數 – 2012-07-16 02:09:40

+0

你嘗試'this.init = function(){....' – 2012-07-16 02:13:18

+0

如果我做this.init到Twitter和Pinterest,同樣的問題那裏。最重要的init被調用。我認爲這又將它們添加到全球?也許我錯了 – 2012-07-16 02:19:02