废话不多说,面试官一上来,直接开问, 妥妥的八股文,背就完事
面试官:你怎么理解闭包? js为什么设计闭包? 有哪些应用场景?
🤷:一个函数中有另外一个函数的访问权力,根据词法作用域查找变量
内部函数可以访问外部函数的变量,通过调用外部函数,返回内部函数后,即使外部函数已经执行结束,但是内部函数引用外部函数的变量依然保存在内存中,这些被保存下来的变量的集合就像一个背包一样跟着内部函数,所以就是闭包.
闭包的意义就是能在函数外部访问到函数内部的变量,逆向的作用域链,利用闭包的变量来做一些事情,比如节流防抖,函数柯里化,模拟块级作用域(立即执行函数)
面试官:那你怎么理解词法作用域的,和作用域有什么区别?
🤷:词法作用域是js引擎如何寻找变量以及在何处寻找变量的规则,由代码中函数声明的位置决定的,所以词法作用域是静态作用域,在代码编译时就确定,与函数的调用无关。而作用域是变量与函数可以访问的范围。分为全局作用域,函数作用域,块级作用域:
- 全局作用域: 作用域中的变量在任何地方都能够访问到,变量的生命周期跟随页面的生命周期
- 函数作用域: 函数中定义的变量只能在函数中访问,函数执行完成,变量随之销毁
- 块级作用域: 只能在块里面访问, 代码执行完成后,变量随之销毁
面试官: js是如何支持块级作用域的?为什么可以同时写var和let const
🤷: var 声明的变量放入执行上下文中的变量环境, let const 声明的变量放入词法环境, let const按块级作用域划分压入到词法环境栈中 .访问变量时 先去词法环境中从栈顶开始查找,如果找到则停止,没有找到则到变量环境中查找.
let 和 const 在块级作用域中 ,初始化变量之前 存在暂时性死区,无法访问变量
面试官: 那说一下js的执行上下文吧?
🤷: 执行上下文是js执行一段代码时的运行环境,确定执行期间用到的this, 变量,以及函数等(变量环境,词法环境,外部环境,this)。主要就是全局上下文和函数上下文。全局上下文代码开始执行就创建,并压入到执行栈中,每遇到函数调用,就将函数上下文压入执行栈。函数执行完成后,从执行栈中跳出。上下文的控制权就交给下一个上下文。
。。。。。。。