JavaScript的闭包和上下文

Tags
JavaScript
函数式编程
CreatedTime
Aug 18, 2022 09:53 AM
Slug
2019-03-27-javascript-second-scope
UpdatedTime
Last updated August 18, 2022

JS 闭包

题目:解释下 js 的闭包
直接上MDN的解释:闭包是函数声明该函数的词法环境的组合。
而在 JavaScript 中,函数是被作为一级对象使用的,它既可以本当作值返回,还可以当作参数传递。理解了:“Js 中的函数运行在它们被定义的作用域,而不是它们被执行的作用域”(摘自《JavaScript 语言精粹》) 这句话即可。
题目:闭包优缺点
闭包封住了变量作用域,有效地防止了全局污染;但同时,它也存在内存泄漏的风险:
  • 在浏览器端可以通过强制刷新解决,对用户体验影响不大
  • 在服务端,由于 node 的内存限制和累积效应,可能会造成进程退出甚至服务器沓机
解决方法是显式对外暴露一个接口,专门用以清理变量:
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(){ ... })()。将变量封装到函数作用域。
② 作用域链
当前作用域没有找到定义,继续向父级作用域寻找,直至全局作用域。这种层级关系,就是作用域链

执行上下文

题目:解释下“全局执行上下文“和“函数执行上下文”。
全局执行上下文
解析 JS 时候,创建一个 全局执行上下文 环境。把代码中即将执行的(内部函数的不算,因为你不知道函数何时执行)变量、函数声明都拿出来。未赋值的变量就是\\undefined\\
下面这段代码输出:undefined;而不是抛出Error。因为在解析 JS 的时候,变量 a 已经存入了全局执行上下文中了。
console.log(a); var a = 1;
函数执行上下文
和全局执行上下文差不多,但是多了thisarguments和参数。
在 JS 中,this是关键字,它作为内置变量,其值是在执行的时候确定(不是定义的时候确定)