"(function ( ) { } ) ( )" 和 "(function ( ) { } ( ) )" 在 JavaScript 中功能相同吗?

IT技术 javascript function
2021-01-19 14:24:55

这两个代码块都低于 alert foothen bar唯一的区别是})()}())

代码 1:

(function()
{
    bar = 'bar';
    alert('foo');
})();

alert(bar);

代码 2:

(function()
{
    bar = 'bar';
    alert('foo');
}());

alert(bar);

那么除了语法之外还有什么区别吗?

3个回答

不; 它们是相同的


但是,如果您new前后添加.something,它们会有所不同。

代码 1

new (function() {
    this.prop = 4;
}) ().prop;

此代码创建此函数类的新实例,然后获取prop新实例属性。
它返回4

它相当于

function MyClass() {
    this.prop = 4;
}
new MyClass().prop;

代码 2

new ( function() {
    return { Class: function() { } }; 
}() ).Class;

此代码调用newClass属性。
由于函数调用的括号在外括号组内,它们不会被new表达式拾取,而是正常调用函数,返回其返回值。
new表达式解析到.Class和实例化。(后面的括号new是可选的)

它相当于

var namespace = { Class: function() { } };

function getNamespace() { return namespace; }

new ( getNamespace() ).Class;
//Or,
new namespace.Class;

如果调用 周围没有括号getNamespace(),这将被解析为(new getNamespace()).Class- 它将调用实例化getNamespace类并返回Class新实例属性。

直接在标识符前面也有区别,如果您在 JavaScript 中不使用分号,这可能会偶然发生。a(function () { return 5; }())减少到a(5)a(function () { return 5; })()减少到a()()进一步减少到5(),这是非法的。
2021-03-20 14:24:55
这些new...prop例子很有帮助。谢谢。
2021-03-21 14:24:55
实际上,括号充当“代码 2”上的临时匿名变量。你也可以写var f = function(){ ... }(); 它会输出相同的结果。
2021-03-31 14:24:55

没有区别 - 左大括号仅用作句法提示,告诉解析器接下来是函数表达式而不是函数声明

没有区别。两者都是函数表达式。

还有第三种方式:

+function() {
    bar = 'bar';
    alert('foo');
}();

(而不是+另一个操作员也可以工作)

最常见的方式是

(function() {
    // ...
})();

尽管。

2021-03-13 14:24:55
命名为“自我调用函数”是误导,因为该功能在它的身上不调用自身递归,但它定义后立即调用。我宁愿称其为“立即调用的函数”。
2021-04-07 14:24:55