如果我将一个函数包装在另一个函数中有什么区别吗?

时间:2016-06-03 21:20:10

标签: javascript browserify

这两者有什么区别? 我在browserify中导入它们,它们似乎给出了相同的结果。 他们和他们的工作方式有什么区别吗?

var App = (function () {
   var Foo = function (name) {
     this.name = name;
   };

   Foo.prototype.logout = function () {
     console.log();
   }

   return Foo;
})();

module.exports = App;

VS

var Foo = function (name) {
  this.name = name;
};

Foo.prototype.logout = function () {
  console.log();
}

module.exports = Foo;

2 个答案:

答案 0 :(得分:2)

在这种特殊情况下,唯一的区别是,在第一个代码示例中,您最终得到一个名为" App"的变量,而在第二个代码中,您最终得到一个名为" Foo&# 34 ;.除了对命名空间的影响之外,两者做同样的事情。

更一般地说,代码如下所示:

var x = function() {
  // lots of stuff
  return something;
}();

允许"很多东西"要在与周围环境隔离的环境中完成。这意味着在匿名函数中定义的函数和变量不会泄漏出来#34;进入周围的上下文,除非它是return语句的明确目标(或者以某种方式影响某些外部上下文的其他代码,最常见的是通过对window或类似jQuery原型的直接修改)。

在你的例子中,再次,"很多东西"在第二个例子中,并没有涉及改变除该函数原型之外的任何命名空间,第一个代码也是如此。

答案 1 :(得分:0)

是的,这两者之间存在差异。第一个示例使您可以安全地使用Foo变量来污染全局范围,因为它包含在IFEE(立即调用函数表达式)中并分配给变量App。由于Foo在IFEE内部,因此属于IFEE的范围。 来自第二个示例的Foo变量在全局范围内,如果您在其他一些代码中导入此文件,如果还存在具有该名称的变量,Foo将覆盖该文件中的变量。因此,为了确保不会发生这种情况,最好将导入的代码包装到IFEE中。 此外,访问变量Foo是不同的,在第一个示例中,您将使用App.Foo访问它(因为它在App下命名空间),然后您可以使用Foo访问它。