前端面试题整理——作用域和闭包

什么是闭包,闭包的表现形式:

    // 作用域应用的特殊情况,有两种表现:
    // 函数作为参数被传递
    // 函数作为返回值被返回

    // 函数作为返回值
    function create() {
        let a = 100
        return function () {
            console.log(a)
        }
    }
    let fn = create();
    let a = 200;
    fn()

    //函数作为参数
    function print(fn) {
        let b = 200;
        fn()
    }
    let b = 100;
    function fnb() {
        console.log(b)
    }
    print(fnb)

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

this的使用场景:

  • 作为普通函数调用
  • 使用call、apply、bind 调用
  • 作为对象方法被调用
  • 在class方法中调用
  • 箭头函数
重点,无论什么场景调用,this的值都是在函数“执行时”被定义,而不是“定义”函数时定义。
箭头函数的this是取函数上级作用域的this

实际开发中闭包的应用:

隐藏数据,如做一个简单的cache工具,闭包隐藏数据,只提供API。
    function createCache() {
        const data = {} // 闭包中的数据被隐藏,不被外界访问
        return {
            set: function (key, val) {
                return data[key] = val
            },
            get: function (key) {
                return data[key]
            }
        }
    }
    const c = new createCache()
    c.set('name','aaa')
    console.log(c.get('name'))

写出下列代码的输出:

    var x = 2;
    var y = {
        x: 3,
        z: (function (x) {
            this.x *= x;
            x += 2;
            return function (n) {
                this.x *= n;
                x += 3;
                console.log(x)
            }
        })(x)
    }
    var m = y.z
    m(4);
    y.z(5);
    console.log(x, y.x);
放弃安逸,持续努力——成长
原文地址:https://www.cnblogs.com/MarsPGY/p/13461877.html