揭示模块模式命名约定

时间:2012-08-02 14:40:40

标签: javascript naming-conventions revealing-module-pattern

我想避免记住一个方法的两个名字,一个用于公共,一个用于私人访问。从这个意义上说,如果你为两者使用相同的名称,那么脚本会失败吗?以下代码何时失败?

var TestClass = function() {
    function showMessage(text) {
        $("div").text(text);
    }
    return {
        showMessage: showMessage
    };
}();

我在this fiddle尝试了它,它可以在FF,IE,Chrome,Safari中正常使用。 JSLint也无话可说。

我经常看到人们命名私有方法_showMessageshowMessageFn。这有充分的理由吗?

我正在寻找的答案是,它在某些情况下会失败,可能会产生混淆,或者只是JavaScript人发明惯例似乎很聪明。

2 个答案:

答案 0 :(得分:3)

这很好 - 您在内部函数的上下文中定义了一个名为showMessage()的函数,然后将其分配给导出的对象文字的showMessage属性。

属性名称可以是any valid identifier,因此showMessage当然是完全有效的。在您的示例中,function showMessage(text)在内部作用域中创建一个名为showMessage的标识符,引用一个函数定义。然后,您创建一个名为showMessage单独的标识符作为property name on the object literal,并为其分配内部标识符引用的函数的值。两个标识符具有相同名称的事实无关紧要,因为它们不存在于同一范围内。

我能看到的唯一问题是你应该将函数调用包装在parens中,否则读者不会立即清楚该函数是自调用的。

所以这个:

var TestClass = function() {
    ...
}();

成为这个:

var TestClass = (function() {
    ...
}());

私有方法通常以下划线为前缀的原因只是一种广泛使用的约定 - 它表明该方法是私有的(Javascript不支持访问修饰符,因此任何未封装的属性或方法)可以从外部范围访问闭包)。接受this StackOverflow quesion的答案完美地总结了这一点。

答案 1 :(得分:0)

您在这里做的是返回一个包含您定义的函数对象的对象。

我认为基本上它是一种显示您是在与创建函数相同的范围内访问函数还是在不同范围内访问函数的方法。