前言
面试问题:
-
说一下对变量提升的理解
-
说明this的几种不同的使用场景
-
创建10个
<a>
标签,点击的时候弹出来对应的序号 -
如何理解作用域
-
实际开发中闭包的应用
涉及到的知识点:
-
执行上下文
-
this
-
作用域
-
作用域链
-
闭包
执行上下文
执行上下文主要有两种情况:
-
全局代码: 一段
<script>
标签里,有一个全局的执行上下文。所做的事情是:变量定义、函数声明 -
函数代码:每个函数里有一个上下文。所做的事情是:变量定义、函数声明、this、arguments
PS:注意“函数声明”和“函数表达式”的区别。
全局执行上下文
在执行全局代码前将window确定为全局执行上下文。
(1)对全局数据进行预处理:(并没有赋值)
-
var定义的全局变量==>undefined, 添加为window的属性
-
function声明的全局函数==>赋值(fun), 添加为window的方法
-
this==>赋值(window)
(2)开始执行全局代码
函数执行上下文
在调用函数, 准备执行函数体之前, 创建对应的函数执行上下文对象(虚拟的, 存在于栈中)。
(1)对局部数据进行预处理:
-
形参变量>赋值(实参)>添加为执行上下文的属性
-
arguments==>赋值(实参列表), 添加为执行上下文的属性
-
var定义的局部变量==>undefined, 添加为执行上下文的属性
-
function声明的函数 ==>赋值(fun), 添加为执行上下文的方法
-
this==>赋值(调用函数的对象)
(2)开始执行函数体代码
执行上下文栈
-
1.在全局代码执行前, JS引擎就会创建一个栈来存储管理所有的执行上下文对象
-
2.在全局执行上下文(window)确定后, 将其添加到栈中(压栈)
-
3.在