2012-08-02 126 views
3

我想避免为一个方法记住两个名字,一个是公开的,一个是私人访问的。从这个意义上说,在这种情况下,如果您为两者使用相同的名称,脚本会失败?下面的代码何时失败?揭示模块模式命名约定

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

我已经尝试过在this fiddle,它工作正常在FF,IE,Chrome浏览器,Safari浏览器。 JSLint也无话可说。

我经常看到人们命名私有方法_showMessageshowMessageFn。这是否有很好的理由?

答案我正在寻找的是,它无论是在某些情况下出现故障,可能会造成混淆,或者说,它只是JavaScript的人发明了约定显得聪明。

+0

这个工作正常 - 你在内部函数的上下文中定义了一个名为showMessage()的函数,然后通过导出的对象文本的showMessage属性来确定和引用它。只有我能看到的问题是,你应该将函数调用包装在parens中,以使其更具可读性。 – 2012-08-02 14:51:50

+0

谢谢。如果您将它添加为答案,我会接受它。 – 2012-08-02 20:36:11

回答

2

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

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

唯一的问题我可以看到的是,你应该包装在括号函数调用,否则就不是立即清楚地向读者该函数是自调用。

所以这样的:

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

变为这样:

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

原因私有方法经常用下划线前缀仅仅是一种广泛使用的约定 - 这表明,该方法旨在private(Javascript不支持访问修饰符,所以任何未封装在闭包中的属性或方法都可以从外部范围访问)。 this StackOverflow quesion接受的答案完美。

0

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

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