闭包

闭包(closure)

:函数连同它作用域链上的要找的这个变量,共同构成闭包
作用:封装数据,暂存数据

var speed = 0 
function fn(){ 
speed++ 
console.log(speed) 
}
 return fn

如下代码输出多少?如果想输出3,那如何改造代码?

var fnArr = [];
for (var i = 0; i < 10; i ++) {
  fnArr[i] =  function(){
    return i
  };
}
console.log( fnArr[3]() ) // 10

前两种都是使用立即执行函数,最后一种是ES6的let

var fnArr = []
for (var i = 0; i < 10; i ++) {
  fnArr[i] =  (function(j){
    return function(){
      return j
    } 
  })(i)
}
console.log( fnArr[3]() ) // 3
var fnArr = []
for (var i = 0; i < 10; i ++) {
  (function(i){
    fnArr[i] =  function(){
      return i
    } 
  })(i)
}
console.log( fnArr[3]() ) // 3
var fnArr = []
for (let i = 0; i < 10; i ++) {
  fnArr[i] =  function(){
    return i
  } 
}
console.log( fnArr[3]() ) // 3

如下代码输出多少?如何连续输出 0,1,2,3,4

for(var i=0; i<5; i++){
  setTimeout(function(){
    console.log('delayer:' + i )
  }, 0)
}

同理,通过立即执行函数产生闭包

for(var i=0; i<5; i++){
  (function(j){
    setTimeout(function(){
      console.log('delayer:' + j )
    }, 0)    
  })(i)
}


for(var i=0; i<5; i++){
  setTimeout((function(j){
    return function(){
      console.log('delayer:' + j )
    }
  }(i)), 0)    
}

函数柯里化-只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。

function sum(a) {
  return function(b) {
    return a + b
  }
}

上面的代码来完成sum(1)(2)两个数相加。

你可能感兴趣的:(闭包)