3

我正在阅读更多开源 javascript 框架,并找到了更多创建匿名函数的方法,但有什么不同和最好的方法?

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

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

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

3 回答 3

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

定义Lib它被调用的对象的属性,并立即被调用this,通常是window. 相反,它可以引用拥有调用它的方法的对象。

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

定义的Lib属性,window不管它在哪里被调用(尽管它也被立即调用)。

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

定义Lib传递给函数的对象的属性。它会立即调用,但除非您global在当前范围内定义了值,否则会导致错误。您可能会window向它传递或一些命名空间对象。


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

例如,更重要的是它们如何定义它们返回/构造/公开的对象的方法和属性(即它们如何构建Lib自身)。

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

于 2012-05-13T22:06:04.117 回答
1

所有这些实际上都等效于(但效率较低且更加模糊):

var Lib = {};

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

请注意,在最后一个示例中,我认为您的意思是:

(function(global) {
  ...
})(this);
于 2012-05-13T22:35:58.033 回答
0

看看这个问题:为什么需要在同一行调用匿名函数?

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

于 2012-05-13T22:00:46.167 回答