js闭包是什么
学习啦在线学习网 闭包(closure)是计算机编程领域的专业名词,指可以包含自由(未绑定到特定对象)变量的代码块,子函数可以使用父函数中的局部变量。闭包源于要执行的代码块和为自由变量提供绑定的计算环境(作用域)两者的结合,Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby、 Python、Lua、objective c 以及Java(Java8及以上)等语言中都能找到对闭包不同程度的支持。
js闭包
学习啦在线学习网 在Javascript中闭包(Closure)
“官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
相信很少有人能直接看懂这句话,因为他描述的太学术。我想用如何在Javascript中创建一个闭包来告诉你什么是闭包,因为跳过闭包的创建过程直接理解闭包的定义是非常困难的。看下面这段
代码
学习啦在线学习网 functiona(){
vari=0;
functionb(){
alert(++i);
}
returnb;
}
varc=a();
c();
特点
学习啦在线学习网 这段代码有两个特点:
1、函数b嵌套在函数a内部;
学习啦在线学习网 2、函数a返回函数b。
这样在执行完var c=a( )后,变量c实际上是指向了函数b,再执行c( )后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说:
学习啦在线学习网 当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
例子
模拟私有变量
function Counter(start){
var count = start;
return{
学习啦在线学习网 increment:function(){
学习啦在线学习网 count++;
},
学习啦在线学习网 get:function(){
学习啦在线学习网 return count;
}
}
}
学习啦在线学习网 var foo =Counter(4);
foo.increment();
学习啦在线学习网 foo.get();// 5
结果
这里,Counter 函数返回两个闭包,函数 increment 和函数 get。 这两个函数都维持着 对外部作用域 Counter 的引用,因此总可以访问此作用域内定义的变量 count.