0
点赞
收藏
分享

微信扫一扫

浅析作用域、自由变量、闭包

作用域

自由变量

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()的地方。

闭包:所有自由变量的查找,是在定义函数的地方,向上级作用域查找,不是在函数执行的地方!!!

举报

相关推荐

0 条评论