繁体   English   中英

匿名函数之间的区别

[英]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;
})();

定义windowLib属性,无论它在何处被调用(尽管它也被立即调用)。

(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM