【问题标题】:Revealing module pattern naming convention揭示模块模式命名约定
【发布时间】:2012-08-02 14:40:40
【问题描述】:

我想避免记住一个方法的两个名称,一个用于公共访问,一个用于私有访问。从这个意义上说,如果您对两者使用相同的名称,在哪种情况下脚本会失败?以下代码何时会失败?

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

我已经在this fiddle 中尝试过,它在 FF、IE、Chrome、Safari 中都能正常工作。 JSLint 对此也无话可说。

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

我正在寻找的答案是它要么在某些情况下失败,可能会造成混乱,要么只是 JavaScript 人发明了看起来很聪明的约定。

【问题讨论】:

  • 这很好用 - 您在内部函数的上下文中定义了一个名为 showMessage() 的函数,然后通过导出对象文字的 showMessage 属性分配和引用它。我能看到的唯一问题是您应该将函数调用包装在括号中以使其更具可读性。
  • 谢谢。如果您将其添加为答案,我会接受。

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


【解决方案1】:

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

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

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

所以这个:

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

变成这样:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多