美文网首页
闭包的作用及立即执行函数

闭包的作用及立即执行函数

作者: 浮巷旧人 | 来源:发表于2018-08-01 21:05 被阅读0次

    闭包的作用

    1.实现共有变量
    eg:函数累加器

      function  add() {
        var count  = 0;
        function demo (){
          count++;
          console.log(count);
        }
        return demo;
    }
    var counter = add();
    counter();1
    counter();2
    counter();3
    counter();4
    

    2.可以做缓存结构(存储结构)
    eg:eater

    function eater() {
           var food = "";
           var obj = {
                 eat :  function () {
                        console.log(" i am eating " + food);
                        food  = "";
                  }
                  push  :  function (myfood){
                          food =  my Food;
                  }
             }
              return obj;
      }
      var  eater1 = eater();
      eater1.push('banana');
      eater1.eat();
    

    3.可以实现封装,属性私有化。
    eg:Person();

    function Person(name){
       //var this = {
      //makeMoney  : function() {}
    //offer : function() {}
    //}
      var money = 100;
      this.name  =  name;
      this.makeMoney = function(){
        money  ++;
      }  
      this.offer = function(){
        money  --;
      }      
      //return this;
    }
    var person = new Person();
    只有Person里面AO两个方法可以访问到属性
    money,money在方法里面的作用链里,person
    是访问不到的,这就是私有化属性。
    

    4.模块化开发,防止污染全局变量

    • 立即执行函数:此类函数没有函数声明,在执行过后即释放。适合做初始化工作。
    (function () {
          var a = 123;
          var b = 234;
          console.log(a+b);
    }( ) )
     如果函数执行完  给函数加个函数名  会报错
    除了执行完立即释放  和其他函数没有什么区别
    
    立即执行函数
    针对初始化功能的函数
    (function () {} () ) ;w3c建议第一种
    (function () {} )();
    只有表达式才能被执行符号执行,被执行符号执行
    的表达式放弃了函数的名称,也就成了立即执行函
    数,而且只能执行一次。
    var  test = function () {
        console.log('a');
    }();
    console.log(test)=>underfined  放弃了函数名称所
    以是underfined  等号前面的是变量声明  后面的是
    变量赋值  也就是函数表达式
    +/-/! function  test () {
     console.log('a');
    }();这里是函数表达式 所以可以直接被执行符号执
    行
    
    function test () {
        var arr = [];
        for(var i = 0; i < 10; i ++){ 
             arr[ i ] = function () {
                  document.write( i + " ");
             }特别注意arr[i]是执行语句,后面的i是函数
    里的i,是定义语句.前面的i取0~9时,后面的i不能
    一起变,只有后面的语句执行时,它才会去找前面
    的i是什么.
         }
          return  arr;
    }
    
    var  myArr = test ();
    for ( var j = 0; j <  10; j++){
       myArr[ j ]( );
    } 
    打印结果10个10
    
    function test () {
        var arr = [];
        for(var i = 0; i < 10; i ++){ 
            (function  (j)  {
             arr[ j ] = function () {
                  document.write( j + " ");
              }
             }(i));
         }
          return  arr;
    }
    
    var  myArr = test ();
    for ( var j = 0; j <  10; j++){
       myArr[ j ]( );
    } 
    打印结果是0~9
    
    • eg:写一个方法求一个字符串的字节长度。字符串有一个方法charCodeAt();一个中文占两个字节,一个英文占一个字节。
    function retByteslen(target) {
      var count = 0;
      for( var i = 0 ; i<target.length; i++){
         if(target.charCodeAt(i) <= 255)  {
            count ++;
        }else  if(target.charCodeAt(i) > 255) {
           count +=2
         }
      }
       console.log(count);
    }或者下种方法
    
    function retByteslen(target) {
      var count = target.length;
      for( var i = 0 ; i<target.length; i++){
         if(target.charCodeAt(i) > 255)  {
            count ++;
        } 
      }
       console.log(count);
    }
    
     var  x = 1;
     if(function f () {}) {
     x += typeof f;
    }
    console.log(x);  =>1underfined
    if括号里无论放的什么条件,都得将里面的东西变
    成表达式,所以再也不是函数定义了,f 从此就消
    失了。  tpyeof 后面接一个从未声明的变量  返回字
    符串类型的underfined
    

    相关文章

      网友评论

          本文标题:闭包的作用及立即执行函数

          本文链接:https://www.haomeiwen.com/subject/wyqdvftx.html