JavaScript 闭包 (w3school.com.cn)
JavaScript中的闭包(Closure)是一个非常重要的概念,它涉及到函数作用域和变量引用的深入理解。
闭包的形成主要依赖于两个特性:函数嵌套和函数内部的变量引用。当一个内部函数引用了其外部函数的变量时,即使外部函数执行完毕,这个内部函数仍然可以访问到外部函数的变量。这是因为JavaScript的垃圾回收机制不会回收被引用的变量,所以即使外部函数执行完毕,其变量仍然存在于内存中,可以被内部函数访问。
下面是一个简单的闭包示例:
function outer() {
let i=1
function 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;
}
})();