【发布时间】:2012-11-02 02:39:09
【问题描述】:
几天前我问了一个类似的问题,但我想我还是做错了什么,所以这个更集中:
据我了解并根据this book,函数privateFunction 应该不能从mySingleton 对象外部使用,其中publicFunction 只能这样调用:mySingleton.publicFunction。
但是 - 违反我的意愿和意图,privateFunction 在对象之外非常可用。
这是为什么呢?我做错了什么?
var mySingleton = new (function (window, document, undefined) {
var privateFunction = function () {
//code
},
mySingleton = {
publicFunction: function () {
//code
}
};
return mySingleton;
})(window, document, undefined);
编辑:我刚刚发现了问题。语法错误,多么丢脸。看看第 2 行的分号。我昨晚发帖时漏掉了这一行:
var mySingleton = new (function (window, document, undefined) {
var self = this;
privateFunction = function () {
//code
},
mySingleton = {
publicFunction: function () {
//code
}
}
return mySingleton ;
})(window, document, undefined);
用逗号替换分号会使私有方法“再次”成为私有方法。无论如何,看看这段代码,我希望这样的语法会导致语法错误,因为privateFunction 后面的逗号 - 我错了吗?
【问题讨论】:
-
您是在浏览器中运行它吗?你能举一个让你认为这是公开的例子吗?
-
@Der - 出于同样的原因,您在任何地方都需要一个私有函数:因为您有一些不属于公共接口的内部机制。
-
@pilau:该功能不公开。 jsfiddle.net/3RwgQ
-
正如 user1689607 的小提琴演示的那样,该函数在全局范围内不可用,
mySingleton.privateFunction()也无法访问。请显示更多代码以演示您遇到的问题。与此无关,您为什么在第一行使用new?同样不相关的是,在最后一行您可能只想传递两个参数(window, document),因为这确保在函数内undefined肯定是未定义的——此机制用于防止其他全局代码设置@ 987654334@ 到其他值。 -
关于逗号。这是一个有效的运算符。逗号运算符的工作方式如下:给定两个语句(变量赋值是语句),同时执行两个语句并返回第二个语句的结果。所以,它仍然是有效的语法。
标签: javascript scope singleton closures