基本上我想要做的是爲匿名函數提供對「私人」函數/變量的訪問。我需要一些關於我實現這個方法的意見,以及可能更好的替代方法。 Fiddle在範圍之外的匿名函數中訪問「私人」成員
觀察下面的代碼片段。
function Something()
{
/*private*/ var _someVariable = 1;
/*private*/ function _someFunction() {
alert('_someFunction');
}
/*public*/this.SomeDelegate1 = function(codeblock) {
var members = $.extend({
_someVariable : _someVariable,
_someFunction:_someFunction
}, this);
codeblock.apply(members);
}
/*public*/this.SomeDelegate2 = function(codeblock) {
var caller = eval('(' + codeblock + ')');
caller.apply(this);
}
}
在SomeDelegate1,我在我的私有成員轉換爲實例成員,並把它作爲背景的 匿名函數像下面看到的。
var someInstance = new Something();
someInstance.SomeDelegate1(
function() {
this._someFunction();
alert(this._someVariable);
}
);
我喜歡這樣一個事實,即人們可以指定您想要公開的成員,但它可能會變得非常笨重,例如,例如,當你需要更新「私有」變量時。
我明顯可以將所有成員編寫爲實例成員,但我更希望他們保持「私有」,只允許在回調函數的範圍內進行訪問。
在SomeDelegate2中,我使用了eval(是的,我意識到所有與此有關的邪惡和巫術)。
var someInstance = new Something();
someInstance.SomeDelegate2(
function() {
_someFunction();
alert(_someVariable);
}
);
因爲我把代碼注入功能,「私下」作用域成員都自動可用,所以我並不需要做的成員等,並沒有大量的工作需要進行任何複製必須做,否則。
這種方法是否存在根本問題?
你有更好的替代方案/方法來實現這一目標嗎?
對我來說這似乎是一個XY問題。在JavaScript中沒有私有或公共的,我認爲在JS中用這種方式解決問題並不好。如果您使用原型和前綴屬性,那麼您將在性能和API中獲得更多優勢,而前綴屬性並非意味着像下面這樣以下劃線來觸及下劃線。 – elclanrs 2014-10-22 07:42:34
意識到這一點,所以我把私人話題放在引號中),但是他們的工作方式也是類似的。 – cstruter 2014-10-22 07:43:43
不這樣說。但是,儘管它們的工作方式類似,但不使用原型,每次創建新實例時都會創建這些函數。而且,你不能使用沒有實例的函數。 – elclanrs 2014-10-22 07:48:10