自由变量
一个变量在当前作用域没有定义,但被使用了,他会向上级作用域一层一层依次寻找,直到找到为止,如果到了全局作用域都没找到,就会报错xx is not defined
闭包
- 作用域应用的特殊情况:
- 函数作为参数被传递
- 函数作为返回值被返回
// 函数作为返回值
function create() {
const a = 100
return function () {
console.log(a)
}
}
const fn = create()
const a = 200
fn() // 100
// 函数作为参数被传递
function print(fn) {
const a = 200
fn()
}
const a = 100
function fn() {
console.log(a)
}
print(fn) // 100
所有的自由变量的查找,是在函数定义的地方,向上级作用域查找,不是在执行的地方!!!
this
- 作为普通函数
- 使用
call apply bind
- 作为对象方法被调用
- 在
class
方法中调用 - 箭头函数
this
在各个场景中取什么值,是在函数执行的时候确认的,不是在函数定义的时候确认的
手写bind
// 模拟 bind
Function.prototype.bind1 = function () {
// 将参数拆解为数组
const args = Array.prototype.slice.call(arguments)
// 获取 this(数组第一项)
const t = args.shift()
// fn1.bind(...) 中的 fn1
const self = this
// 返回一个函数
return function () {
return self.apply(t, args)
}
}