JS 闭包

题目:解释下 js 的闭包

直接上MDN的解释:闭包是函数声明该函数的词法环境的组合。

而在 JavaScript 中,函数是被作为一级对象使用的,它既可以本当作值返回,还可以当作参数传递。理解了:“Js 中的函数运行在它们被定义的作用域,而不是它们被执行的作用域”(摘自《JavaScript 语言精粹》) 这句话即可。

题目:闭包优缺点

闭包封住了变量作用域,有效地防止了全局污染;但同时,它也存在内存泄漏的风险:

解决方法是显式对外暴露一个接口,专门用以清理变量:

function mockData() {
    const mem = {};
    return {
        clear: () => (mem = null), // 显式暴露清理接口
        get: page => {
            if (page in mem) {
                return mem[page];
            }
            mem[page] = Math.random();
        }
    };
}

作用域和作用域链

题目:如何理解 JS 的作用域和作用域链。

① 作用域

ES5 有”全局作用域“和”函数作用域“。ES6 的letconst使得 JS 用了”块级作用域“。

为了解决 ES5 的全局冲突,一般都是闭包编写:(function(){ ... })()。将变量封装到函数作用域。

② 作用域链

当前作用域没有找到定义,继续向父级作用域寻找,直至全局作用域。这种层级关系,就是作用域链

执行上下文

题目:解释下“全局执行上下文“和“函数执行上下文”。

Powered by Fruition