zoukankan      html  css  js  c++  java
  • 立即调用表达式

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

    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解释器会将期解析为函数定义表达式,否则会解析为函数声明语句。而表达式是调用表达式所必须的。
     
  • 相关阅读:
    Centos7安装vsftpd
    Centos7安装FTP突然无法登录
    关于limit_req和limit_conn的区别
    linux nginx大量TIME_WAIT的解决办法--转
    discuz过滤词语无效
    XMReport相关视频资料
    XMReport富文本编辑器上线啦!!! 小小莫_6ada
    mysql/mybatis insertBatch插入速度太慢了
    TCP学习笔记
    Apache Derby ij下面连接Embedded数据库
  • 原文地址:https://www.cnblogs.com/kaixinbocai/p/4256818.html
Copyright © 2011-2022 走看看