浅析作用域、自由变量、闭包
作用域
全局作用域: 变量未受到函数的约束,在全局可以使用,如windows对象,document对象
函数作用域: 在函数中定义的变量只能在当前函数中有效
块级作用域(ES6):在某个{}声明的,只在当前{}有效
自由变量
一个在当前作用域中没有定义,但是被使用了
向上级作用域,一层一层一席寻找,直至找到为止
如果到全局作用域都没找到则报错 xx is not defined
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、函数作为返回值被返回
2、函数作为参数被传递
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()的地方。
闭包:所有自由变量的查找,是在定义函数的地方,向上级作用域查找,不是在函数执行的地方!!!
发表评论 (审核通过后显示评论):