![](/img/trans.png)
[英]Can anyone explain the difference between closure and anonymous functions?
[英]Difference between anonymous functions
我正在阅读更多开源的javascript框架,并找到了更多如何创建匿名函数的方法,但最新的方法是什么?
(function() {
this.Lib = {};
}).call(this);
(function() {
var Lib = {}; window.Lib = Lib;
})();
(function(global) {
var Lib = {}; global.Lib = Lib;
})(global);
(function() {
this.Lib = {};
}).call(this);
定义Lib
,它被称为上,并立即叫上对象的属性this
是通常的window
。 它可以改为引用拥有调用它的方法的Object。
(function() {
var Lib = {}; window.Lib = Lib;
})();
定义window
的Lib
属性,无论它在何处被调用(尽管它也被立即调用)。
(function(global) {
var Lib = {}; global.Lib = Lib;
})(global);
定义传递给函数的对象的Lib
属性。 它会被立即调用,但除非您在当前范围内为global
定义了值,否则将导致错误。 您可以将window
或某个命名空间对象传递给它。
这些实际上并不是定义“匿名函数”的不同方式,它们都使用标准的方式来执行此操作。 这些是为全局(或有效全局)属性赋值的不同方法。 从这个意义上说,它们基本上是等价的。
更重要的是,例如,他们如何定义它们返回/构造/暴露的对象的方法和属性(即,它们如何构建Lib
本身)。
所有这些函数都返回undefined
,只有第一个函数可以作为构造函数(使用new
)有用,所以看起来它们只不过是框架的初始化器。
所有这些都是有效的(但效率更低,更加模糊):
var Lib = {};
立即调用的函数表达式(IIFE)可以方便地用于更广泛和有条件地创建对象和方法的变量范围,但它们可能被过度使用。
请注意,在最后一个示例中,我认为您的意思是:
(function(global) {
...
})(this);
看看这个问题: 为什么需要在同一行上调用匿名函数?
它包含有关匿名函数的大量信息。 看看这个问题: var functionName = function(){} vs function functionName(){}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.