对于每一名web前端开发的人来讲,闭包,总是一个熟悉却又陌生的词汇。在这里谈一下我个人对js 闭包的认识,看法以及对闭包的理解。
1.什么是闭包:
1. 闭包是将一个函数定义在一个函数的内部,然后返回这个函数作为外部函数的返回值。
2. 闭包就是能够访问其他函数内部的变量,又因为在javascript中只有函数内部的子函数才能访问局部变量,所以说,
闭包也可以理解为:“定义在函数内部的函数”
3. 本质上闭包是将函数内部和函数外部联通起来。
来个列子:
function makeSizer(size) {
//makesizer函数的返回值是下面的函数
return function() {
//此函数访问外部函数的变量
console.log(size)
};
}
var size12 = makeSizer(12);
var size14 = makeSizer(14);
var size16 = makeSizer(16);
size12();
size14();
size16();
//返回值
12
14
16
2.为什么要有闭包?
在js 中变量分为全局变量和局部变量,全局变量的作用域是全局作用域,局部变量的作用域为局部作用域。
JavaScript 局部变量特征:
变量在函数内声明,变量为局部作用域。局部变量:只能在函数内部访问。
因为局部变量只作用于函数内,所以不同的函数可以使用相同名称的变量。
局部变量在函数开始执行时创建,函数执行完后局部变量会自动销毁。
JavaScript 全局变量特征:
变量在函数外定义,即为全局变量。
全局变量有 全局作用域: 网页中所有脚本和函数均可使用。如果变量在函数内没有声明(没有使用 var 关键字),该变量为全局变量。
综上,可以在函数内部访问全局变量,但是无法在全局环境中访问函数内部的变量。
显而易见,闭包就是为了解决在全局环境中可以访问函数内部的变量
3.闭包的优缺点
优点:
1.希望一个变量长期存储在内存中。
2.避免全局变量的污染。
缺点:
1.内存消耗,因为变量会保存在内存
2.使用不当会很容易造成内存泄露。