在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() { // ... })();
虽然。