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

作者: loushumei | 来源:发表于2020-04-27 10:49 被阅读0次

    作用域

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

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

    相关文章

      网友评论

        本文标题:浅析作用域、自由变量、闭包

        本文链接:https://www.haomeiwen.com/subject/lixywhtx.html