如果我将代码复制到这样的闭包中
(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是否可以工作,因此functionA和functionB可以访问闭包内的private.2。
它们将被复制到闭包中,因此复制的版本应该可以访问它。这就是我制作闭包并将private1和private2放在一起的原因。
该对象的书面版本(不是复制版本)在jslint中引发错误,我的猜测是因为它违反了范围规则。
函数参数(非参数)是全局范围内的未命名变量,无法访问闭包。
(直到将其复制到其中:)
如果我将private1
和private 2
相同的对象说成只有private
...然后使用this
关键字进行访问,那么它是否有效。
我宁愿将它们分开。
答案 0 :(得分:1)
您的代码存在语法错误,而 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所解释的特权方法访问它们克罗克福德在他的文章Private Members in JavaScript中。扩展上述内容,可能是:
publik = {
set : function (...) {
...
},
getPrivate1: function (name) {
return (typeof name == 'string')? private1[name] : private1;
},
...
};