这是:
(function(a) {
return 3;
})(this);
相当于:
(function() {
return 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时。
我想明显的反问题就是你问题背后的用例: