以下这两个代码块都提醒foo
然后bar
。唯一的区别是})()
和}())
。
代码1:
(function()
{
bar = 'bar';
alert('foo');
})();
alert(bar);
代码2:
(function()
{
bar = 'bar';
alert('foo');
}());
alert(bar);
除了语法之外,还有什么不同吗?
答案 0 :(得分:59)
没有;他们是相同的
但是,如果事先添加new
,之后添加.something
,则会有所不同。
new (function() {
this.prop = 4;
}) ().prop;
此代码创建此函数类的新实例,然后获取新实例的prop
属性。
它返回4
。
相当于
function MyClass() {
this.prop = 4;
}
new MyClass().prop;
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() {
// ...
})();
虽然。