2014-02-08 38 views
0

爲了維持一個命名空間的緣故,我有一些代碼看起來是這樣的:提到過「這個」匿名外功能,通過內部函數

MyNamespace = function() { 
    var foo; 
    //other private vars 

    //some private functions 

    //return certain functions which will be publicly called through MyNamespace 
    return { 
     "pubFunc1": function() {/*do stuff*/} 
    } 
} 

我想我的公共職能之一能夠把一個函數作爲一個參數。被傳入的函數看起來像這樣:

function(state) { 
    //do something with the passed in state 
} 

此函數將被傳遞到第一個匿名函數中。從那裏,如參數所暗示的,第一個匿名函數會將其狀態(與this)傳遞給剛剛傳入的函數。我遇到的問題是匿名函數的this引用全局window,而不是到匿名功能。

我真正需要的是能夠傳遞一個函數,並賦予它在我的命名空間函數中完全訪問私有變量和函數。有沒有人知道這樣做的好方法?

+0

我不知道如何/在哪裏,你要調用的函數,但如果你想確定'this'指向哪個值,可以使用'.call'或'.apply':https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/呼叫。當然,你不能訪問不在範圍內的變量,這是不可能的。 –

+1

'this'的值由如何調用函數決定。爲了我們能夠幫助你,我們需要確切地看到你如何調用你想控制'this'的函數,然後才能提出具體的建議,但是你可能想要按順序使用'.call()'根據需要設置'this'指針。私有變量只能被其代碼實際在變量所在範圍內的函數訪問。如果正確設置了'this',那麼可以很好地訪問實例變量,因此可以使用'this'引用該對象的屬性。 – jfriend00

回答

1

Javascript使用詞法作用域,也就是說,只有物理上位於外部函數內部的函數才能訪問其作用域(var s)。對於外部定義的任何功能,無法使功能的var可訪問。

所以你才使「私人」選項瓦爾到「保護」的屬性和屬性包傳遞給回調:

MyNamespace = function() { 
    return { 
     _foo: "something", 
     _bar: "else", 
     pubFunc1: function(callback) { 
      callback(this._foo, this._bar) //or 
      callback(this) 
     } 
    } 
} 
+0

這會允許語法,如'MyNamespace._foo =「其他」'?如果確實如我所料,那麼之前的私有變量將會受到公共職能之外的來源的影響。無論如何,我正確地標記了你的答案,因爲它闡明瞭函數中定義的'var's不能被外部定義的函數訪問,這正是我期望做的。 – Rhitakorrr

+0

@Rhitakorrr:在javascript中沒有「private」和「public」屬性的概念。每個地產都可以到處訪問。 – georg

+0

有效的點。我最終(錯誤地)用這個術語來描述與其他事物有關的範圍。因此,爲了更好地說明,通過「MyNamespace._foo =」更改值「',命名空間之外的東西是否可以訪問'_foo'和'_bar'?順便說一句,「私有」的含義是,那些不屬於return語句的變量在被調用的函數範圍之外是不可訪問的,並被分配給'myNamespace'。 – Rhitakorrr