命名空间javascript中的私有函数

时间:2010-10-01 16:43:08

标签: javascript

我正在尝试定义一种方法,我可以控制对工作中使用的javascript方法的访问(编码标准改进驱动的一部分)。

我计划使用的模式很好,直到我想到我们使用第三方脚本方法做什么。

如何调整我的代码以允许从jQuery方法内部访问私有函数?

var NameSpace = new function () {

    // My private function I want to access.
    var privateFunction = function () {

    };

    this.publicFunction = function () {

        // I can access my private function here.
        privateFunction();

        jQuery(window).resize(function () {

            // But not here :(
            privateFunction();

        });
    };
};

1 个答案:

答案 0 :(得分:10)

    // I can access my private function here.
    privateFunction();
    jQuery(window).resize(function () {
        // But not here :(
        privateFunction();
    });

是的,你可以。 JavaScript是静态范围的。您可以在该调整大小回调中访问每个封闭范围的所有变量和函数,包括privateFunction(只要您没有通过在嵌套范围中定义privateFunction来遮蔽它。)

您不能做的是访问封闭函数之外的任何局部变量。

  

我正在尝试定义一种方法,我可以控制对工作中使用的javascript方法的访问(编码标准改进驱动的一部分)。

我认为这是毫无意义的练习。

命名空间有助于避免不必要的名称冲突。真正的“私人”成员是严格执行严格的安全边界。但这是JavaScript:您不是在运行具有不同访问级别和沙盒的代码,就像您在Java中一样。您不必盲目地在JavaScript中重现Java的安全模型。这里的'攻击者'是谁?自己呢?你团队中的其他程序员?

数据隐藏和封装是很好的做法,但您不需要严格执行私有性来实现此目的。实际上,拥有真正的私有化可能会使调试和原型设计任务变得更加困难。考虑类似Python的方法,您只需标记不应从外部使用的成员,例如使用前导下划线。任何使用伪私人成员的人都知道他们正在做他们不应该做的事情,并且希望这样做有一个很好的临时理由。