- 函数作为返回值
function create(){const a = 100return function (){console.log(a) //a在这里是自由变量,向上寻找}
}const fn = create()
const a = 200
fn() //100
- 函数作为参数
function print(fn){const a = 13fn()
}
const a = 100
function fn(){console.log(a)
}
print(fn) //100
闭包:自由变量的查找是在函数定义的地方向上级作用域查找,而不是在执行的地方!
this
取什么值是在函数执行的时候确定的,不是函数定义的时候确定- 箭头函数的this永远取上级作用域的值。
- 使用
call(..)
可以确保this指向函数本身
this
实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用。
总结
手写bind函数第一个绑定的是this
。
bind 的功能是:
- 返回一个新函数。
- 当调用新函数时,this 指向指定的对象。
- 可以预置一些参数,调用新函数时这些参数自动传递给原函数。
注意:
- this要传进去
- 参数要传进去
- 返回值要返回回来
下面的arguments
可获取一个函数的所有的参数,它不是数组需要将其转换为数组形式。
apply第一个参数是this,第二个参数是数组
总结:
bind 函数的实现核心就是通过闭包保存 this 和参数信息,并在执行时将它们传递给原函数。如果你觉得代码有些复杂,建议先理解以下几个关键点:
this 是动态的,可以通过 apply 或 call 方法来改变函数执行时的 this 指向。
闭包可以用来保存 this 和参数,从而在返回的函数中继续使用这些值。
new 调用的特殊情况需要我们使用 instanceof 来判断,并相应处理。