专业术语
- 变量、常量、数据类型
- 形参、实参
- 匿名函数、具名函数、自执行函数
- 函数声明、函数表达式
- 堆、栈
- 同步、异步、进程、线程
执行上下文
当函数执行时,会创建一个执行上下文的环境,分为创建和执行两个阶段
创建阶段
创建阶段,指函数被调用但还未执行任何代码时,此时创建了一个拥有3个属性的对象
executionContext = {
scopeChain: {}, // 创建作用域链
variableObject: {}, // 初始化变量、函数、形参
this: {} // 指定this
}
代码执行阶段
代码执行阶段主要的工作是1、分配变量、函数的引用、赋值;2、执行代码
函数作用域变量是在定义时栈向外找,不是调用时向外找
let 经过babel编译 直接编译成var, 但是会有很多hack技巧
闭包
高级程序设计中,闭包是指有权访问另一个函数作用域中的变量的函数,可以理解为能够读取其它函数内部变量的函数
function outer () {
var top = 'yuanxin'
return function inner () {
console.log(top)
}
}
const inner = outer()
this
场景1:函数直接调用 -> 全局或undefined
场景2:函数被别人调用 -> 执行时谁点出来就是谁
注意这个执行时, 所以回调函数是全局
场景3:new 一个实例的时候 -> new出来的实例
场景4:call,apply,bind调用的时候
场景5:箭头函数指向离这个箭头函数最近的非箭头函数上下文
例:
var obj = {
name: 'zhangsan',
getName: function () {
console.log(this.name)
}
}
// 逗号表达式,返回后一个值
(1, obj.getName)() //这里的this是window 所以console结果是undefined
箭头函数认不认call、apply?