模块模式中的函数声明与函数表达

时间:2014-06-30 06:24:21

标签: javascript module-pattern function-declaration iife function-expression

我刚刚了解了函数声明和函数表达式之间的区别。这让我想知道我是否在AngularJS代码中做得对。我遵循John Papa使用的模式,但现在看起来与模块模式的典型JS方法不一致。 John Papa在他的控制器和服务中大量使用嵌套的函数声明。这不好吗?

有没有理由支持这个:

var foo = (function() {
    var bar = function() { /* do stuff */ };
    return {
       bar : bar
    };
}());

foo.bar();

对此:

var foo = (function() {
    return {
       bar : bar
    };

    function bar() { /* do stuff */ };
}());

foo.bar();

我主要是一名C#开发人员,并且仍然习惯了JavaScript的所有细微差别。我更喜欢后一种方法,因为IIFE中的所有功能都是私有的,顶部的揭示模块模式实际上是公共部分。在C#类中,我总是在私有支持函数之前拥有我的公共属性和方法。但是,我意识到它在JS世界中可能不那么干脆。

使用后一种方法有哪些隐患(如果有的话)?

1 个答案:

答案 0 :(得分:8)

两种方法之间没有功能差异,只是风格。

JavaScript解释器无形地将函数声明从后一种样式“提升”到嵌套函数的顶部 - 如果没有,则return块将引用未定义的函数。