首页 > 代码库 > 立即调用表达式

立即调用表达式

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

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内部访问ivar i = 0; return function () {console.log(++i);};} // 注意,counter和counter2是不同的实例,分别有自己范围内的i。 var counter = makeCounter();counter(); // logs: 1counter(); // logs: 2 var counter2 = makeCounter();counter2(); // logs: 1counter2(); // logs: 2 alert(i); // 引用错误:i没有defind(因为i是存在于makeCounter内部)。

 

        很多情况下,我们不需要makeCounter多个实例,甚至不需要显示返回值。
         更简便的方式——立即调用表达式
//方式一:(function(){//模块代码}()) //方式二:(function(){//模块代码}());

 

外层的圆括号不可少,有了该圆括号JavaScript解释器会将期解析为函数定义表达式,否则会解析为函数声明语句。而表达式是调用表达式所必须的。
 
<style></style><style></style><style></style>

立即调用表达式