在JavaScript中,“(function(){})()”和“(function(){}())”功能是否相同?
下面的这两个代码块都会提示foo然后bar 。 唯一的区别是})()和}()) 。
代码1:
(function() { bar = 'bar'; alert('foo'); })(); alert(bar);
代码2:
(function() { bar = 'bar'; alert('foo'); }()); alert(bar);
除了语法之外,还有什么区别吗?
没有; 他们是相同的
但是,如果事先添加new和之后的东西,它们将会不同。
代码1
new (function() { this.prop = 4; }) ().prop;
此代码创建此函数的类的新实例,然后获取新实例的prop属性。
它返回4 。
这相当于
function MyClass() { this.prop = 4; } new MyClass().prop;
代码2
new ( function() { return { Class: function() { } }; }() ).Class;
此代码在Class属性上调用new 。
由于函数调用的圆括号在外部括号内,因此不会被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属性。
没有什么区别 – 左括号仅作为语法提示来告诉解析器,接下来是函数表达式而不是函数声明 。
没有区别。 两者都是函数表达式。
还有第三种方法:
+function() { bar = 'bar'; alert('foo'); }();
(而不是+另一个操作员也会工作)
最常见的方式是
(function() { // ... })();
虽然。