这两个自动执行的匿名Javascript函数等效吗?

这两个自动执行的匿名Javascript函数等效吗?,javascript,Javascript,这是: (function(a) { return 3; })(this); 相当于: (function() { return 3; })(); 如果有任何差异,请解释好,第一个你要传递的参数,但它从未被使用过。但是,两者的功能是相同的。第二个稍微快一点,因为没有无缘无故地传递一个参数,假设这个参数不是经过优化的。这取决于如何定义等效参数 如果你用函数的实际功能来定义它,那么,是的,它们是等价的。当然,这只适用于他们当前的内容。一个不同之处是,第一个可以访问外部,而第

这是:

(function(a) { 
    return 3;
})(this); 
相当于:

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

如果有任何差异,请解释好,第一个你要传递的参数,但它从未被使用过。但是,两者的功能是相同的。第二个稍微快一点,因为没有无缘无故地传递一个参数,假设这个参数不是经过优化的。

这取决于如何定义等效参数

如果你用函数的实际功能来定义它,那么,是的,它们是等价的。当然,这只适用于他们当前的内容。一个不同之处是,第一个可以访问外部,而第二个不能访问,尽管在您的示例中这并不重要

关于你的评论,是否只是通过这一点在这里有区别:不,它没有

如果以不同的方式定义等效,则函数可能不同,例如,当定义等效为具有相同的算术数时


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

我想你在寻找区别:第二个例子可以通过a变量访问外部this,而第二个例子没有

通常,您不需要向IIFE传递参数(当然可以),以获得更可读或模块化的代码,因为新声明的函数可以访问其外部范围变量:

var foobar = 5;
(function() {
    // I can use the outer-scope `foobar` in here!
})();
但是,这是一个例外情况,因为新创建的函数将有自己的this,该this将覆盖外部this:

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

var foobar = 5;
(function() {
    var foobar = 7;
    // I can't use the outer-scope `foobar`
    // because it is shadowed by local-scope `foobar`
})();
类似的事情也发生在这件事上。在我的foobar示例中,阴影是显式完成的,但在这种情况下,阴影总是会发生,因为每个函数都会在这一天获得一个新的局部范围

您可以通过在此处使用正式参数将外部文件别名为新名称来访问外部文件:

// 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隐藏。请注意,您还可以将此外部变量别名为另一个外部范围变量,如:

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

它们是相等的,因为您对该参数不做任何操作。@DontVoteMeDown:Javascript中的参数是可选的吗?因为除非它们是等价的,否则这两个函数是不等价的。@RobertHarvey它们是等价的,您可以向函数传递任意数量的参数,即使没有定义任何参数,也可以通过arguments数组访问它们。任何未经批准的参数都是未定义的。第二个参数无法访问这是什么,所以它们不是。我只是好奇传递这个变量是否会有任何不同。你有一个基准来证明它更快吗?似乎这可能取决于解析器的优化。我试图了解这个变量在幕后是否有任何不同。我不明白这是为了什么,我看到了一个使用这种风格的开源javascript库,我试图理解它。我会做更多的研究,然后带着一个更好的问题回来。@user2202911:很可能,他们的函数实际上使用了传递给它的参数,而不是只返回3;。谢谢你向我介绍阴影概念。我没有意识到这一点,所以我很难说出这个问题,谢谢!
var outerThis = this;
(function() {
    // we can access the outer-scope `outerThis` because it is not shadowed
})();