作用域
自由变量
let a=0
function fn1(){
let a1=100
function fn2(){
let a2=200
function fn3(){
let a3=300
return a+a1+a2+a3
}
}
}
fn1()
在实例方法fn3中,a、a1、a2均为自由变量
闭包
1. 函数作为返回值
function create() {
let a = 100 // step2. 在上级作用域找到a,故打印100
return function () {
console.log(a) // step1. 当前作用域中未找到 a,a为自由变量
}
}
let fn = create()
let a = 200
fn() //100
结果分析:函数作为返回值时,根据结果发现打印了create方法作用域下的a,根据自由变量逐层向上寻找的规则,故自由变量a是从createn内定义的方法里面向上查找的,不是在方法fn()执行的地方。
2. 函数作为参数被传递
function print(fn){
const a=200
fn()
}
const a=100 //step2. 在上级作用域找到a,故打印100
function fn(){
console.log(a) //step1. 当前作用域中未找到 a,a为自由变量
}
print(fn) //100
结果分析:函数作为参数被传递时,根据结果发现打印了全局作用域下的a,根据自由变量逐层向上寻找的规则,故自由变量a是从定义的fn()方法里面向上查找的,不是在还函数print内执行fn()的地方。
闭包:所有自由变量的查找,是在定义函数的地方,向上级作用域查找,不是在函数执行的地方!!!