面试题 -- JavaScript闭包的概念与理解?
# 闭包(closure)
概念
闭包 (opens new window)是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。
创建
在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。
特性
- 函数嵌套函数。
- 内部函数可以引用外层函数的参数与变量。
- 参数与变量不会被垃圾回收机制回收,可以通过引用一直访问到这些内容。
# 示例
function init() {
var name = "Mozilla"; // name 是一个被 init 创建的局部变量
function displayName() { // displayName() 是内部函数,一个闭包
alert(name); // 使用了父函数中声明的变量
}
displayName();
}
init();
init() 创建了一个局部变量 name 和一个名为 displayName() 的函数。displayName() 是定义在 init() 里的内部函数,并且仅在 init() 函数体内可用。请注意,displayName() 没有自己的局部变量。然而,因为它可以访问到外部函数的变量,所以 displayName() 可以使用父函数 init() 中声明的变量 name 。
# 9大使用场景
- 返回值(最常用,如
Vue的data()函数) - 函数赋值
- 函数参数
IIFE(自执行函数)- 循环赋值
getter和setter- 迭代器(执行一次函数往下取一个值)
- 首次区分(相同的参数,函数不会重复执行)
- 缓存
详情参考理解JavaScript闭包9大使用场景 (opens new window)
# 说说你对闭包的理解?
使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在
js中,函数即闭包,只有函数才会产生作用域的概念.闭包的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。
闭包的另一个用处,是封装对象的私有属性和私有方法。