3

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

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

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

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

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

4

2 回答 2

3

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

属性名称可以是任何有效的标识符,因此showMessage当然是完全有效的。在您的示例中,function showMessage(text)创建一个在内部范围内调用的标识符showMessage,引用一个函数定义。然后,您在对象字面量上创建一个称为属性名称的单独标识符,该标识符分配给内部标识符引用的函数的值。两个标识符具有相同名称的事实无关紧要,因为它们不存在于同一范围内。showMessage

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

所以这:

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

变成这样:

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

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

于 2012-08-03T09:56:51.057 回答
0

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

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

于 2012-08-02T14:58:57.253 回答