这两个自执行匿名Javascript函数是否相同?

时间:2013-12-17 20:12:36

标签: javascript

这是:

(function(a) { 
    return 3;
})(this); 

相当于:

(function() {
    return 3;
})(); 

如果有任何差异,请解释

3 个答案:

答案 0 :(得分:2)

以下是我认为您正在寻找的区别:第二个示例可以访问外部this(通过a变量),而第二个示例则没有。

通常情况下,你不需要需要将参数传递给IIFE(尽管你肯定可以,以获得更多可读或模块化代码),因为新声明函数可以访问其外部范围变量:

var foobar = 5;
(function() {
    // I can use the outer-scope `foobar` in here!
})();

但是,this是一种例外情况,因为新创建的函数将拥有拥有 this,它将遮蔽外部this

// outer here, `this` is one thing
(function() {
    // in here, `this` might be something else
    // because each new functions invocation sets `this` within the function
})();

你可以看到非this变量的阴影行为,如下所示:

var foobar = 5;
(function() {
    var foobar = 7;
    // I can't use the outer-scope `foobar`
    // because it is shadowed by local-scope `foobar`
})();

this也发生了类似的事情。在我的foobar示例中,阴影是显式完成的,但使用this时,阴影始终会发生,因为每个函数都会获得一个新的局部范围this

您可以通过将新名称别名来访问外部this,通过正式参数在此处完成:

// outer here, `this` is one thing
(function(outerThis) {
    // in here, `this` might be something else
    // but `outerThis` refers to the outer `this`
})(this);

如果您没有将外部this替换为新名称,则无法访问该名称,因为它将被本地this隐藏。请注意,您还可以将外部this别名为另一个外部作用域变量,例如:

var outerThis = this;
(function() {
    // we can access the outer-scope `outerThis` because it is not shadowed
})();

答案 1 :(得分:0)

嗯,首先你要传递一个参数,但它从未使用过。但是,两者的功能相同。第二个是稍微快一些,因为没有理由不通过论证,假设这不仅仅是优化了。

答案 2 :(得分:0)

这取决于您如何定义等效

如果你根据实际做什么来定义它,那么,是的,它们是等价的。当然,这只适用于他们目前的内容。一个区别是第一个可以访问外部this,而第二个不能访问 - 尽管这在您的示例中无关紧要。

关于你的评论是否只是传递this在这里有所不同:不,它没有。

如果您以不同的方式定义等效,则可能的功能不同,例如将等效定义为具有相同的arity时。

我想明显的反问题就是你问题背后的用例:为什么你问这个? (如果这不仅仅是出于好奇和出于学术原因。)