如果我将代码复制到这样的闭包中
(function(){
var private1 = {},
private2 = {},
publik;
publik.get(object){
private1[object.name] = object;
};
window.publik = publik;
}())
publik.get({
// API
name: 'name_foo',
functionA: function(){
// I can not access private2 in here
},
functionB: function(){}
})
有没有一种方法可以让 API 工作,以便函数 A 和函数 B 可以访问闭包中的私有 2。
它们将被复制到闭包中,因此复制的版本应该可以访问它。 这就是为什么我关闭并将 private1 和 private2 放在一起的原因。
对象的书面版本(不是复制版本)在jslint中抛出错误,我的猜测是这是因为它违反了范围规则。
函数参数(不是参数)是全局范围内的一个未命名变量,并且无法访问闭包。
( 直到 被复制到其中 :)
如果我private1
并private 2
同一个对象说......只是private
...然后使用this
关键字访问它。
但是,我宁愿将它们分开。
您的代码存在语法错误,get 似乎最好命名为 set。此外,您的代码似乎并不特定于浏览器,因此最好使用更通用的全局对象而不是特定的窗口对象。
考虑如下内容:
(function(global){
var private1 = {name: 'private1'},
private2 = {name: 'private2'},
publik;
publik = {
set: function (object) {
private1[object.name] = object;
}
};
global.publik = publik;
}(this))
publik.set 方法可以通过闭包访问 private1 和 private2,您可以通过特权方法访问它们,正如 Douglas Crockford 在他的文章 Private Members in JavaScript 中所解释的那样。扩展上述内容,可能是:
publik = {
set : function (...) {
...
},
getPrivate1: function (name) {
return (typeof name == 'string')? private1[name] : private1;
},
...
};