闭包是指有权访问另一个函数作用域中的变量的函数,
创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量
闭包的特点和优点
闭包的特点:
闭包的优点
function fun(){
var m=2;
var n=3;
function f1() {
n++;
m++;
console.log(m,n);
}
return f1;
}
var fn = fun();
fn();//3 4
fn();//5 6
当代码中出现全局变量,全局函数名重名的现象,这种情况将会下边覆盖上面的,我们把这个叫做变量污染
var fun1 = (function () {
var a = 3;
return {
b: 7,
sum: function () {
return this.b + a;
}
}
})()
console.log(fun1.sum());
fun1是作为一个自执行函数返回定义的,因此fun1实际上是返回的对象,而对象下有一个方法sum,因此fun1,sum就是调用该对象下的sum方法,注意,a是自执行函数的
私有变量,b是对象的共有属性,因此,调用b的时候this.b可以在对象内调用,也可以在外部使用this.b调用,但是在外部是无法调用变量a的,因为他是局部变量。
currying:咖喱:有所有的调料给放在一起成大料的这样的意思
分批次向函数中传入不同的参数,当再次执行不再传参的时候,统一执行最终结果。
function currying(callbcak){
var arr = [];
return function(){
if(arguments.length>0){
arr.push(...arguments);
return arguments.callee;
}else{
return callbcak(...arr)
}
}
}
var f = currying(function(){
return Array.from(arguments).reduce((v,t)=>v+t)
})
f(1,2,3);
f(1,2,3);
var s=f();
console.log(s)//12
柯力化描述二
Function.prototype.currying = function(){
var arg = Array.from(arguments);
var self = this;
return function(){
if(arguments.length===0){
return self.apply(null,arg);
}
arg = arg.concat(Array.from(arguments));
}
}
function fs(){
console.log(Array.from(arguments));
}
var f1 = fs.currying();
f1(1,2);
f1(3,4);
f1();