Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、执行上下文
- 范围:一段
<script>或者一个函数就会生成一个执行上下文 - 全局:变量定义、函数声明
- 函数:变量定义、函数声明、this、arguments
二、this
- this要在执行时才能确定,定义时无法确认
三、作用域
- js中无块级作用域,所以尽量不要在块里声明变量(这和在块外声明是一样的,反而会导致程序不宜读)
- 有函数和全局作用域
四、作用域链
- 自由变量:没有在当前作用域定义的变量
- 下图的代码中a是自由变量,当执行到
console.log(a)时需要去函数的父级作用域查找,父级作用域是全局作用域,所以打印a=100。函数的父级作用域是函数定义时确定的,下面的代码中的时全局作用域
-
下图的代码中F2的父级作用域时F1,a、b时自由变量
-
查找a时,先在F2的父级作用域-F1中查找,没有,就再去F1的父级作用域-全局作用域中查找,找到a=100
-
查找b时,先在F2的父级作用域-F1中查找,找到b=200
-
父级作用域没有,就去父级的父级作用查找,依次进行,直到查找到全局作用域结束,这就是作用域链,,即自由变量的查找
五、闭包
- 函数作为返回值
- 函数作为参数传递
- 下图代码打印的是100
六、面试题
(一)说一下对变量提升的理解
- 变量定义
- 函数声明
(二)说明this几种不同的使用场景
- 作为构造函数执行
- 作为对象属性执行
- 作为普通函数执行
- call apply bind
(三)创建10个a标签,点击时弹出对应的序号
-
错误的写法
-
正确的写法
(四)如何理解作用域
- 自由变量
- 作用域链,即自由变量的查找
- 闭包的两个场景
(五)实际开发中闭包的应用
- 主要用于封装变量,收敛权限