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

Amy*_*y B 55 javascript function

均低于警戒这些代码块foo,然后bar.唯一的区别是})()}()).

代码1:

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

alert(bar);
Run Code Online (Sandbox Code Playgroud)

代码2:

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

alert(bar);
Run Code Online (Sandbox Code Playgroud)

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

SLa*_*aks 59

没有; 他们是相同的


但是,如果您new事先添加,.something之后添加,则会有所不同.

代码1

new (function() {
    this.prop = 4;
}) ().prop;
Run Code Online (Sandbox Code Playgroud)

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

它相当于

function MyClass() {
    this.prop = 4;
}
new MyClass().prop;
Run Code Online (Sandbox Code Playgroud)

代码2

new ( function() {
    return { Class: function() { } }; 
}() ).Class;
Run Code Online (Sandbox Code Playgroud)

此代码调用new上的Class财产.
由于函数调用的括号在外部括号中,因此new表达式不会拾取它们,而是正常调用函数,返回其返回值.
new表达式解析到.Class和实例化.(后面的括号new是可选的)

它相当于

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

function getNamespace() { return namespace; }

new ( getNamespace() ).Class;
//Or,
new namespace.Class;
Run Code Online (Sandbox Code Playgroud)

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


Aln*_*tak 7

没有区别 - 开头括号只作为语法提示告诉解析器接下来是函数表达式而不是函数声明.


Thi*_*ter 6

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

还有第三种方式:

+function() {
    bar = 'bar';
    alert('foo');
}();
Run Code Online (Sandbox Code Playgroud)

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

最常见的方式是

(function() {
    // ...
})();
Run Code Online (Sandbox Code Playgroud)

虽然.

  • http://jsperf.com/self-invoking-function (2认同)