快速理解JS闭包
为了快速理解JS闭包,加强记忆,整理一下JS闭包知识
- 变量的作用域
- 如何外部读取函数内部的变量
- 闭包的概念
- 闭包的用途
- 使用闭包的优缺点
详细说明
变量的作用域
变量分为全局变量和局部变量,全局变量即:定义在函数外的变量;局部变量即:定义在函数内的变量。
代码块
var num1 = 1; // 全局变量
function test() {
var num2 = 2; // 局部变量
num1 = 3;
console.log(num2); // 2
console.log(num1); // 3
}
test();
console.log(num1); // 3
console.log(num2); // num2 is not defined
如何外部读取内部的变量
函数里既可以访问全局变量也可以访问局部变量,函数外只可以访问全局变量,如果需要访问局部变量就用到了闭包。
代码块
var num1 = 1; // 全局变量
function test() {
var num2 = 2; // 局部变量
num1 = 3;
console.log(num1) // 3
return function() {
return num2
}
}
console.log(test()()) // 2
闭包的概念
满足下面的三个条件就是闭包,1. 闭包是一个函数; 2.闭包使用其他函数定义的变量,使其不被销毁; 3. 闭包存在定义该变量作用域中。即闭包建立起函数内部和函数外部的连接
代码块
function test() {
var num1 = 1;
return function() {
num1 += 1;
return num1;
}
}
var test1 = test();
console.log(test1()); // 2
console.log(test1()); // 3
console.log(test1()); // 4
闭包的用途
- 读取函数内部的变量 2.让变量的值始终存在内存中
闭包的优缺点
优点: 1.可以使函数内部的变量和函数外部通信 2. 使用常驻内存,意味着读取速度快,变量一初始化可以重复使用
缺点: 1. 函数外部可以改变局部变量的值 2. 当函数调用结束之后,该变量仍然存在内存中,会导致内存泄漏