1,闭包是什么: 浏览器加载页面时候会将函数放在栈中执行,当函数进栈执行时,会形成一个上下文,此上下文保护函数内部的变量不受外界干扰,并且当前上下文中某些内容被上下文以外内容占用时候,此上下文也不会出栈释放,这样保存内部的变量和变量值,闭包是一种保存和保护机制; 2.应用闭包场景, 1.基于闭包把自己编写的模块内容保护起来,这样自己编写的代码都是私有,防止和别人变量或代码冲突;2.在没有let 时候我们处理循环处理机制的时候,用闭包只不过现在都基于let因为let会产生块级作用域来保存需要内容; 3.不建议过多使用闭包
4.除了开发,研究别人源码和自己写插件时候,利用高阶函数技巧 惰性函数,柯里化,compose函数
柯里化:
function fn(x,y){
//第一次执行函数,形成一个临时不被释放的上下文(闭包),在闭包中我们保存传递的参数信息,当后期需要该参数时候我们会基于作用链机制网上查找,所以形成的闭包相当于是对参数信息进行存储。
return function(z){
//最后小函数执行的时候需要对前面的值进行累加
return x+y+z
}
}
let res = fn(1,2)(3)
console.log(11,res)
使用: Function.prototype.bind预先处理this redux源码
function curry(fn){
debugger
console.log('arguments',arguments)
var args=Array.prototype.slice.call(arguments,1)
console.log('args',args)
return function(){
debugger
var innerArgs = Array.prototype.slice.call(arguments)
console.log('innerArgs',innerArgs)
var finalArgs = args.concat(innerArgs)
console.log('finalArgs',finalArgs)
return fn.apply(null,finalArgs)
}
}
function add(num1,num2,num3){
debugger
console.log(num1,num2,num3)
return num1+num2+num3
}
var carryadd = curry(add,5)
alert(carryadd(3,3))