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

时间:2011-05-09 15:07:23

标签: javascript function

以下这两个代码块都提醒foo然后bar。唯一的区别是})()}())

代码1:

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

alert(bar);

代码2:

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

alert(bar);

除了语法之外,还有什么不同吗?

3 个答案:

答案 0 :(得分:59)

没有;他们是相同的


但是,如果事先添加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;

此代码在new属性上调用Class 由于函数调用的括号位于外部括号中,因此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属性实例

答案 1 :(得分:7)

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

答案 2 :(得分:6)

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

还有第三种方式:

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

(而不是+另一个运算符也可以工作)

最常见的方式是

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

虽然。