JS 闭包 和 沙箱模式

64 阅读1分钟

闭包定义

  1. 需要 直接 或者 间接的 返回一个函数
  2. 内部函数需要访问外部函数的局部变量
  • 好处
    1. 延长变量的生命周期
    2. 在函数外可以使用函数内的变量
  • 弊端
    • 执行空间不会被销毁,如果大量使用会造成内存泄漏
function outter () {
    let a = 100
    let obj = {
        name:'outer函数',
        age:18
    }
    
    function inner () {
        return a
    }
    
    //直接返回一个函数
    return inner
}

const newFn = outter()

let num = newFn()
console.log(num) // 100

沙箱模式

  • 利用了 函数内 "间接 "的返回了一个函数
  • 外部函数 返回了 一个对象,这个对象内书写多个函数
function outer () {
    //1.放置一些外部函数的私有变量
    let a = 0
    let b = 999
    
    //2.对象内部放置若干个 函数
    const obj = {
        getA: function () {
            return a
        },
        setA: function (val) {
            a = val
        },
        getB () {
            return b
        },
        setB (val) {
            b = val
        }
    }
    //3.将对象返回到函数外
    return obj
}

//得到函数内部的对象,这个对象内部有多个操作函数
const res = outer()
//得到函数内部的私有变量a
let winA = res.getA()
//修改函数内部的私有变量a
res.setA(winA + 1)

console.log(res.getA())

沙箱模式语法糖

  • 语法糖: 在不影响功能的情况下,给我们提供了一些更简单的操作方式
  • 其实就是利用 getter 和 setter 帮助我们简化了一些操作与代码
//普通版沙箱模式
function outer () {
    let a = 1
    return {
        getA() {
            return a
        },
        setA(val) {
            a = val
        }
    }
}
const res = outer()
res.setA(99)
console.log(res.getA()) // 99


//语法糖版
function outer() {
    let a = 1
    return {
        get a() {
            return a
        },
        set a(val) {
            a = val
        }
    }
}
const res = outer()
console.log(res.a)
res.a = 999
console.log(res.a)