闭包可以让你从内部函数访问外部函数作用域,在javascript中每当函数被创建,就会在函数生成时生成闭包
function init (){
var name = '小明'; //name 是一个被 init 创建的局部变量
function displayName(){ // displayName() 是内部函数,一个闭包
console.log(name) // 使用了父函数中声明的变量
}
displayName()
}
init()
function init2(){
var age = 20;
function displayAge(){
console.log(age);
}
return displayAge;
}
init2()();
从本质上讲 makeadd是一个工厂函数 创建了将指定的值和他的参数相加求和的函数
function makeadd(x){
return function(y){
return x+y
}
}
var add5 = makeadd(5);
var add6 = makeadd(6);
console.log(add5(4))
console.log(add6(2))
Counter1 和 Counter2是各自独立的 每个闭包都是引用自己词法作用域内的变量privateCounter
每次调用其中一个计数器时,通过改变这个变量的值,会改变这个闭包的词法环境,然而在一个闭包内对变量的修改,不会影响另一个闭包中的变量
var makeCounter = function() {
var privateCounter = 0;
function changeBy(val) {
privateCounter += val;
}
return {
increment: function() {
changeBy(1);
},
decrement: function() {
changeBy(-1);
},
value: function() {
return privateCounter;
}
}
};
var Counter1 = makeCounter();
var Counter2 = makeCounter();
console.log(Counter1.value()); /* logs 0 */
Counter1.increment();
Counter1.increment();
console.log(Counter1.value()); /* logs 2 */
Counter1.decrement();
console.log(Counter1.value()); /* logs 1 */
console.log(Counter2.value()); /* logs 0 */
创建一个可以无限次调用的闭包函数
function a(){
var i = 10;
return function b(){
console.log(i)
return b
}
}
console.log(a()()()()()()())
网友评论