基本概念
闭包是指有权访问另一个函数作用域中变量的函数
如何形成闭包
内部的函数存在外部作用域的引用就会导致闭包。
词法作用域对执行环境的保护
Javascript的作用域有两部分组成即词法作用域和动态作用域 前者是静态的,比如
var x = 1
function a() {
var y = 1
function b() {
var z = 2
console.log(x, y, z)
}
return b
}
var fn=a()
//b无论在何处执行都是可以读取到x,y,z
fn()
闭包形成的几种方式
函数作为返回值
function createMine(){
const private='秘密'
return function(){
console.log(private)
}
}
const m =createMine()
m()
第一种方法就是这个工厂函数将返回一个匿名函数。这样按照作用域规则,匿名函数确实可以调用工厂函数createMine的作用域。而由于外部任何函数又无法直接访问createMine的局部变量。
函数作为参数
const arr=[]
function createMine(arr){
const private='秘密'
arr.push(function(){
console.log(private)
})
}
createMine(arr)
arr[0]()
该方式通过函数参数为值传递的概念,将函数内部变量存储在实形参内,从而达到目的
利用作用域
let fn
function createMine(){
const private='秘密'
fn=function(){
console.log(private)
}
}
createMine()
fn()
面试攻略
- 说清闭包产生的原因,不要把循环陷阱当做闭包