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

作用域

全局作用域: 变量未受到函数的约束,在全局可以使用,如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()的地方。

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值