11Js面试题-作用域和闭包

149 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一、执行上下文

  • 范围:一段<script>或者一个函数就会生成一个执行上下文
  • 全局:变量定义、函数声明
  • 函数:变量定义、函数声明、this、arguments

image.png

二、this

  • this要在执行时才能确定,定义时无法确认

image.png

三、作用域

  • js中无块级作用域,所以尽量不要在块里声明变量(这和在块外声明是一样的,反而会导致程序不宜读)
  • 有函数和全局作用域

image.png

四、作用域链

  • 自由变量:没有在当前作用域定义的变量
  • 下图的代码中a是自由变量,当执行到console.log(a)时需要去函数的父级作用域查找,父级作用域是全局作用域,所以打印a=100。函数的父级作用域函数定义时确定的,下面的代码中的时全局作用域

image.png

  • 下图的代码中F2的父级作用域时F1,a、b时自由变量

  • 查找a时,先在F2的父级作用域-F1中查找,没有,就再去F1的父级作用域-全局作用域中查找,找到a=100

  • 查找b时,先在F2的父级作用域-F1中查找,找到b=200

  • 父级作用域没有,就去父级的父级作用查找,依次进行,直到查找到全局作用域结束,这就是作用域链,,即自由变量的查找

image.png

五、闭包

  • 函数作为返回值
  • 函数作为参数传递

image.png

  • 下图代码打印的是100 image.png

六、面试题

(一)说一下对变量提升的理解

  • 变量定义
  • 函数声明

(二)说明this几种不同的使用场景

  • 作为构造函数执行
  • 作为对象属性执行
  • 作为普通函数执行
  • call apply bind

(三)创建10个a标签,点击时弹出对应的序号

  • 错误的写法 image.png

  • 正确的写法

image.png

(四)如何理解作用域

  • 自由变量
  • 作用域链,即自由变量的查找
  • 闭包的两个场景

(五)实际开发中闭包的应用

  • 主要用于封装变量,收敛权限

image.png