立即调用表达式

分清几个概念:
 
表达式和语句

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解释器会将期解析为函数定义表达式,否则会解析为函数声明语句。而表达式是调用表达式所必须的。
 

posted on 2015-01-28 19:46  随啵不逐流  阅读(587)  评论(0编辑  收藏  举报