常见闭包形式

闭包:内部函数传递到所在的词法作用域以外,它都会持有对原始作用域的引用,无论在何处执行这个函数都会形成闭包
 
// 1.返回值 最常用的一种形式是函数作为返回值被返回
function test(){
  var a=100;
  return function(){
    return a;
  }
}
var act=test()();
console.log(act);

// 2.函数赋值 一种变形的形式是将内部函数赋值给一个外部变量
var act;
function test1(){
  var a=100;
  function b(){
    return a;
  }
  act=b;
}
test1();
console.log(act());

// 3.函数参数  闭包可以通过函数参数传递函数的形式来实现
var change=function(fn){
  console.log(fn());
};
function test2(){
  var a=100;
  function b(){
    return a;
  }
  change(b);
}
test2();

// 4.IIFE
var change2=function(fn){
  console.log(fn());
};
(function(){
    var a=100;
    function b(){
      return a;
    }
    change2(b);
})()

// 5.循环赋值
// wrong1
var arr=[];
for(var i=0,j=2;i<j;i++){
  arr[i]=function(){
    return i;
  }
}
console.log(arr[0]());

// right1
var arr=[];
for(var i=0,j=2;i<j;i++){
  arr[i]=(function(m){
    return function(){
      return m;
    }
  })(i)
}
console.log(arr[0]());

// wrong2
function foo(){
    var arr = [];
    for(var i = 0; i < 2; i++){
        arr[i] = function(){
            return i;
        }
    }
    return arr;
}
var bar = foo();
console.log(bar[0]());//2  

// right2
function foo(){
    var arr = [];
    for(var i = 0; i < 2; i++){
        arr[i] = (function(j){     
            return function(){
                return j;
            }
        })(i);
    }
    return arr;
}
console.log(foo()[0]());//0 
console.log(foo()[1]());//1

// 6.get  set  控制变量
var get,set;
(function(){
  var a=100;
  get=function(){
    return a;
  }
  set=function(b){
    a=b;
  }
})()
console.log(get());
set(200);
console.log(get());

// 7.迭代器
var count=(function(){
  var a=100;
  return function(){
    return ++a;
  }
})()
console.log(count());
console.log(count());

function setup(x){
    var i = 0;
    return function(){
        return x[i++];
    }
}
var next = setup(['a','b','c']);
console.log(next());//'a'
console.log(next());//'b'
console.log(next());//'c'

// 8.区分首次
var firstTime=(function(){
  var arr=[];
  return function(m){    
    if (arr.indexOf(m)<0) {
      arr.push(m);
      return true;
    }else{      
      return false;
    };
  }
})()
console.log(firstTime(10));
console.log(firstTime(10));
console.log(firstTime(10));
console.log(firstTime(20));
console.log(firstTime(20));

猜你喜欢

转载自www.cnblogs.com/justSmile2/p/9916942.html