立即调用表达式
分清几个概念:
表达式和语句
var square = function(x){ return x*x; } //函数定义表达式 P63
function square(x){ return x*x; } //函数声明语句,var和function都是声明语句,它们声明或定义变量或函数。P94、95
调用表达式
JavaScript中调用表达式是一种调用(或者执行)函数或方法的语法表示。任何一个调用表达式都包含一对圆括号和左圆括号之前的表达式。
自定义表达式(自执行函数表达式)使用的场景
在JavaScript是函数作用域,我们可以定义一个函数用做临时的命名空间,在这个命名空间内定义的变量都不会污染到全局命名空间。假设你写的一大段代码要用在不同的程序中,代码中定义了一个变量存储中间值,那么,就会有这样的问题,当模块代码放到不同的程序中执行时,你无法得知这个变量是否已经创建过,如果创建过,就会和代码发生冲突。
例:
function mymodule(){ //模块代码 //这个模块所使用的所有变量都是全局变量,不会污染全局命名空间 } mymodule();//调用这个函数
任何一个function在执行的时候都会创建一个执行上下文,因为为function声明的变量和函数有可能只在该function内部,这个上下文,在调用function的时候,提供了一种简单的方式来创建自由变量或私有子function。
例:
// 由于该function里返回了另外一个function,其中这个function可以访问自由变量i // 所有说,这个内部的function实际上是有权限可以调用内部的对象。 function makeCounter() { // 只能在makeCounter内部访问i var i = 0; return function () { console.log(++i); }; } // 注意,counter和counter2是不同的实例,分别有自己范围内的i。 var counter = makeCounter(); counter(); // logs: 1 counter(); // logs: 2 var counter2 = makeCounter(); counter2(); // logs: 1 counter2(); // logs: 2 alert(i); // 引用错误:i没有defind(因为i是存在于makeCounter内部)。
很多情况下,我们不需要makeCounter多个实例,甚至不需要显示返回值。
更简便的方式——立即调用表达式
//方式一: (function(){ //模块代码 }()) //方式二: (function(){ //模块代码 }());
外层的圆括号不可少,有了该圆括号JavaScript解释器会将期解析为函数定义表达式,否则会解析为函数声明语句。而表达式是调用表达式所必须的。