JavaScript 闭包 (w3school.com.cn)
JavaScript中的闭包(Closure)是一个非常重要的概念,它涉及到函数作用域和变量引用的深入理解。
闭包的形成主要依赖于两个特性:函数嵌套和函数内部的变量引用。当一个内部函数引用了其外部函数的变量时,即使外部函数执行完毕,这个内部函数仍然可以访问到外部函数的变量。这是因为JavaScript的垃圾回收机制不会回收被引用的变量,所以即使外部函数执行完毕,其变量仍然存在于内存中,可以被内部函数访问。
下面是一个简单的闭包示例:
function outer() {let i=1function fn() {console.log(i)}return fn
}
const fun =outer()
fun() // 1
//外侧函数使用内部函数的变量
function outerFunction() {var counter = 0;function innerFunction(){return counter += 1;}return innerFunction;/*注意 typeof innerFunction 是:function;而typeof innerFunction()是number;*/
}
var add = outerFunction();/*
调用 outerFunction()返回的是内部函数innerFucntion,那么调用几次add()将调用几次
内部函数inner Function,内部函数公用了counter,所以能够计数,所以说闭包就是将内部嵌套函数变成外部可调用的。
*/add();
add();
add();
闭包可以有多种写法:
var add = (function(){var count = 0;//外部访问的计数器,局部变量.var fun = function(){return ++count;}return fun;
})();//或者
var add2 = (function(){var count = 0;//外部访问的计数器,局部变量.function plus(){return ++count;
}
return plus;
})();//或者
var add3 = (function(){var count = 0;//外部访问的计数器,局部变量.return function(){return ++count;}
})();