匿名函数之间的区别

时间:2012-05-13 21:54:58

标签: javascript anonymous-function

我正在阅读更多开源的javascript框架,并找到了更多如何创建匿名函数的方法,但最新的方法是什么?

(function() {
    this.Lib = {};
}).call(this);

(function() {
    var Lib = {}; window.Lib = Lib;
})();

(function(global) {
    var Lib = {}; global.Lib = Lib;
})(global);

3 个答案:

答案 0 :(得分:3)

(function() {
    this.Lib = {};
}).call(this);

定义调用它的对象的Lib属性,并立即在this上调用,通常是window。它可以改为引用拥有调用它的方法的Object。

(function() {
    var Lib = {}; window.Lib = Lib;
})();

定义Lib的{​​{1}}属性,无论它在何处被调用(尽管它也被立即调用)。

window

定义传递给函数的对象的(function(global) { var Lib = {}; global.Lib = Lib; })(global); 属性。它会立即调用,但除非您在当前范围内为Lib定义了值,否则将导致错误。您可以将global或一些命名空间对象传递给它。


这些实际上并不是定义“匿名函数”的不同方法,它们都使用标准的方法来执行此操作。这些是为全局(或有效全局)属性赋值的不同方法。从这个意义上讲,它们基本上是等价的。

更重要的是,例如,他们如何定义它们返回/构造/暴露的对象的方法和属性(即,它们如何构建window本身)。

所有这些函数都返回Lib,只有第一个函数可以作为构造函数(使用undefined)有用,所以看起来它们只不过是框架的初始化器。

答案 1 :(得分:1)

所有这些都是有效的(但效率更低,更加模糊):

var Lib = {};

立即调用的函数表达式(IIFE)可以方便地用于更广泛和有条件地创建对象和方法的变量范围,但它们可能被过度使用。

请注意,在上一个例子中,我认为你的意思是:

(function(global) {
  ...
})(this);

答案 2 :(得分:0)

查看此问题:Why do you need to invoke an anonymous function on the same line?

它包含有关匿名函数的大量信息。看看这个问题:var functionName = function() {} vs function functionName() {}