我正在阅读更多开源的javascript框架,并找到了更多如何创建匿名函数的方法,但最新的方法是什么?
(function() {
this.Lib = {};
}).call(this);
(function() {
var Lib = {}; window.Lib = Lib;
})();
(function(global) {
var Lib = {}; global.Lib = Lib;
})(global);
答案 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)