揭示模块模式命名约定

3

我希望避免记住一个函数的两个名称,一个用于公共访问,另一个用于私有访问。在这种情况下,如果同时使用相同的名称,脚本会在哪些情况下失败?以下代码将在何时失败?

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

我在这个Fiddle里试过了,它可以在Firefox、IE、Chrome、Safari中正常工作。JSLint也没有任何问题。
我经常看到人们将私有方法命名为_showMessageshowMessageFn。这样做有好的理由吗?
我想要的答案是,这样做可能在某些情况下失败,会产生混淆,或者只是JavaScript程序员发明惯例来显得聪明。

这个代码可以正常工作 - 你在内部函数的上下文中定义了一个名为showMessage()的函数,然后通过导出的对象字面量的showMessage属性进行赋值和引用。我唯一能看到的问题是你应该将函数调用括在括号中以使其更易读。 - chrisfrancis27
2个回答

3
这很好 - 你在内部函数的上下文中定义了一个名为showMessage()的函数,然后将其分配给导出对象文字的showMessage属性。属性名称可以是任何有效标识符,因此showMessage当然是完全有效的。在您的示例中,function showMessage(text)在内部作用域中创建了一个名为showMessage的标识符,引用函数定义。然后,您创建了一个单独的标识符,称为showMessage,作为对象文字上的属性名称,其被赋值为由内部标识符引用的函数的值。它们具有相同名称的事实是不相关的,因为它们不存在于同一作用域中。

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

所以这个:

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

变成这个:

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

私有方法通常加下划线是一种广泛使用的惯例 - 这表明该方法打算是私有的(Javascript不支持访问修饰符,因此没有封装在闭包中的任何属性或方法都可以从外部范围访问)。这个StackOverflow问题 的被接受的答案完美地总结了这一点。

0
你在这里做的是返回一个包含你定义的函数对象的对象。
我认为基本上这是一种方法,可以显示你是否在创建它的相同作用域或不同作用域中访问该函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接