zoukankan      html  css  js  c++  java
  • 闭包的10种形式

    1.返回值
    
    var fn = function (){
      var name = 'asd';
      return function(){
        return name;
      }
    }

    var fnc = fn();
    console.log(fnc());
    2.函数赋值 一种变形的形式 是将内部函数赋值给一个外部的变量

    var fn2;
    var fn = function(){
      var name = 'waw';
      var a = function(){
        return name;
      }
      fn2 = a;
    }
    fn();
    console.log(fn2());
    3.函数参数

    function fn2(f){
      console.log(f());
    }
    function fn(){
      var name = 'uuj';
      var a = function(){
        return name;
      }
      fn2(a);
    }
    fn();


    4. IIFE 立即执行函数

    function fn3(f){
      console.log(f());
    }

    (function(){

      var name = 'alex';
      var a = function(){
        return name;
      }
      fn3(a);
    })();


    5.循环赋值

    function foo(){

    var arr = [];
    for(var i = 0; i < 10; i++){

    // (function(i){
    // arr[i] = function(){
    // return i;
    // }
    // })(i);

    arr[i] = (function(n){
    return function(){
    return n;
    }
    })(i);

    }
    return arr;
    }
    var bar = foo();
    console.log(bar);
    console.log(bar[3]());

    6 getter setter  ,将要操作的变量保存在函数内部,防止暴露在外部
    
    var getValue,setValue;
    (function(){
         var num = 0;
         getValue = function (){
               return num;
         }
          setValue = function (v){
                if (typeof v=== 'number'){
                  num = v;
    } } })();
    console.log(getValue());
    setValue(10);
    console.log(getValue());



    7.迭代器

    //计数器
    var add = function(){
    var num = 0;
    return function (){
    return ++num;
    }
    }();
    console.log(add());
    console.log(add());


    //
    function setUp(arr){
    var i = 0;
    return function (){
    return arr[i++];
    }
    }

    var next = setUp(['a1','a2','a3']);
    console.log(next());
    console.log(next());
    console.log(next());


    8 . 区分首次

    var firstLoad = (function(){
    var list = [];
    return function(id){
    if (list.indexOf(id) >= 0){
    return false;
      }else{
          list.push(id);
           return true;
        }
    }
    })();
    firstLoad(19); // true
    firstLoad(19); // false
    9. 缓存机制
    
       未加入缓存:
        
        function mult(){
        
        var sum = 0;
        for(var i= 0;i < arguments.length;i++){
          sum = sum + arguments[i];
        }
        return sum;
      }

        console.log(mult(1,2,3,1,1,2,3));
        console.log(mult(1,2,3,1,1,2,3));
      有缓存的:

      var mult = function(){
        
        var cache = {};
        var calculate = function(){
          var sum = 0;
          for (var i= 0;i < arguments.length;i++){
            sum = sum + i;
          }
          return sum;
        }
         return function(){

          var args = Array.prototype.join.call(arguments,',');
          if (args in cache){
            return cache[args];
           }
          console.log(args);
          return cache[args] = calculate.apply(null,arguments);
        }

    }();
      
      console.log(mult(1,2,3,1,1,2,3));
      
      console.log(mult(1,2,3,1,1,2,3));
    
    
    10. img图片对象上报
    
    
    
    
    
    
    var report = function(src){
         var imgs = [];
    
         return function (src){
              
              var  img = new Image();
              imgs.push(img);
              imgs.src = src;
    
        }
        
    
    }();   
    
    report('http:xxx.com/getinfo');
  • 相关阅读:
    运算符
    变量
    JSP EL表达式使用
    MySQL JDBC 连接数据库基本操作
    一个带标号的CSS文章列表写法
    CSS图片列表
    YUI3 CSS
    Ubuntu 13.10 64位 无法 安装 ia32-libs 解决办法
    [转]编译Android源代码常见错误解决办法
    js 复制对象
  • 原文地址:https://www.cnblogs.com/angdh/p/13974343.html
Copyright © 2011-2022 走看看