javascript|“怪异的写法”()

var a;
(function(){
a.f1 = {},
a.f2 = "String"
}) ();
alert(a.f2)

首先,用括号包围起来的 function(){...} 被js引擎认为是一个function表达式,后面的 () 就调用了这个匿名函数。


如果你写成 function(){...}() 那就是语法错误,因为js引擎会期待这里是一个有名字的function声明(func声明与func表达式是不同的);
但是可以写成 void function(){...}() 也是可以的,因为void关键字会告诉js引擎后面要跟一个表达式,所以后面就被认出来是一个function表达式所产生的匿名函数对象,并进行调用的结果,void会把调用结果抛弃。

另外 new function(){}() 也是类似的。

这样写的主要好处是,可以把一些不希望暴露出来的内部变量和方法隐藏在匿名函数里面。(
特别是这点。比如直接在js中写:
for(var i = 0; i < ...; i ++)
...
那么就会有一个window.i属性被设置,长期存在
而用 (function () { for ( ...) })() 就只是局部变量,执行完就能被清除 )

【javascript|“怪异的写法”()】

    推荐阅读