2012-08-13 80 views
3

我有我認爲是一個相當簡單的問題,但它是我找不到答案的。我有一個對象字面意思,我已經創建了組函數,我想知道如何創建一個變量,該變量位於對象字面值內,並且可由該對象字面值內的所有函數編輯/可訪問。目前,我知道如何做到這一點的唯一方法是創建一個全局變量,但我想停止以這種方式填充全局變量。爲了更好地描述我在尋找什麼小提琴基本的JavaScript代碼佈局

http://jsfiddle.net/aT3J6/

感謝,任何幫助。

var clickCount = 0; 

/* I would like to place clickCount inside hideShowFn Object but all function inside need access to it, so global within hideShowFn */ 

hideShowFn = { 
    init:function(){ 
    $('.clickMe').click(this.addToCount);     
    }, 

addToCount:function(){ 
    clickCount++; 
    $('<p>'+ clickCount + '</p>').appendTo('body'); 
    } 
} 

hideShowFn.init(); 
+0

你可以用所有的代碼在一個函數? – 2012-08-13 21:20:16

+3

如果將所有代碼封裝在一個閉包中(function(){...})();'它將保持全局作用域的清潔。 – 2012-08-13 21:21:28

回答

2

創建它立即調用和返回對象,用函數內部的私有變量的函數,就像這樣:

var obj = (function() { 
    var privateStuff = 'private'; 
    return { 
     func1: function() { 
      //do stuff with private variable 
     }, 
     func2: function() { 
      //do stuff with private variable 
     } 
    }; 
}()); 

http://jsfiddle.net/BE3WZ/

這是有私有變量的方式在Functional Programming

+0

謝謝,但我仍然對這是如何工作感到困惑。如果你能把它重新裝入小提琴中,我將不勝感激? – scottmwilliams 2012-08-13 21:25:52

+0

我編輯了我的答案,稍微解釋了我的方法並給出了一個jsfiddle示例的鏈接。 – Cokegod 2012-08-13 21:28:58

1

您可以封閉爲Cokegod說,也可以在使用可變this

hideShowFn = { 
    clickCount: 0, 
    init:function(){ 
     $('.clickMe').click(this.addToCount);     
    }, 
    addToCount:function(){ 
     this.clickCount++; 
     $('<p>'+ this.clickCount + '</p>').appendTo('body'); 
    } 
} 

hideShowFn.init(); 

這不到風度的工作簡單地添加到對象和訪問正如Musa所說,addToCount的範圍將是點擊dom節點。

但請看Cokegod的答案。

+2

當'addToCount'被稱爲點擊處理程序'this'將引用'.clickMe'元素而不是對象'hideShowFn' – Musa 2012-08-13 21:28:48

+0

您必須在點擊函數'hideShowFn.clickCount'中調用原始名稱空間。 – adeneo 2012-08-13 21:30:26

+2

爲什麼我不能低估自己? – andlrc 2012-08-13 21:31:41

2

http://jsfiddle.net/mattblancarte/aT3J6/10/

另一種選擇是僞古典主義風格:

function Constructor(){ 
    var private = 'private'; 
    this.public = 'public'; 

    this.methods = { 
    //your methods here... 
    }; 
} 

var obj = new Constructor(); 

不要忘記使用new關鍵字,否則你將要全局範圍。

你的代碼翻譯成這種風格將是:

function Test(){ 
    var that = this, 
     clickCount = 0; 

    this.init = function(){ 
    $('.clickMe').click(this.addToCount); 
    }; 

    this.addToCount = function(){ 
    clickCount++; 
    $('<p>'+ clickCount + '</p>').appendTo('body'); 
    }; 
} 

var test = new Test(); 
test.init(); 
+0

爲什麼他需要一個構造函數來創建這個對象?他顯然只需要它的一個副本... – Cokegod 2012-08-13 21:34:45

+0

我沒有做出任何假設。 OP對如何控制範圍感到好奇。我的回答顯示了另一種方式。 – 2012-08-13 21:40:24