【问题标题】:Why are my functions public? [closed]为什么我的函数是公开的? [关闭]
【发布时间】: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


【解决方案1】:

你见过这种代码吗?

var toto = 'titi',
    titi = 'tata',
    tata = 'toto';

这是多项作业。这使我们不必每次都重用var 关键字。但是,由于您没有使用 var 关键字,privateMethod 实际上已泄漏到全局范围。这很糟糕。

我认为您正在寻找这种模式:

var mySingleton = function() {
    function privateMethod() {}

    return {
        publicMethod: function() {}
    };
}();

不需要window、document 和undefined 废话。

【讨论】:

  • 我认为函数中定义的每个变量都只在该函数的范围内(而且是子函数)?编辑:slebetman 在上面的 cmets 中回答了这个问题。
  • 为什么不需要window、document和undefined参数?
  • 其实在这篇文章的 cmets 部分有很多意见支持采用这种方法
猜你喜欢
  • 2014-11-06
  • 1970-01-01
  • 2013-09-17
  • 2012-12-14
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多