我们先了解下 call,apply,bind三者各自的特点,这三个方法的核心实现思路(重要)
函数柯里化在下边叙述
call : 1、能调用函数,2、能改变函数this指向,3、普通传参
apply :和call用法一致,但是传参形式为数组
bind:1、不能调用函数,返回一个用法和原函数一致但this已经改变的新函数,2、改变函数this指向,3、传参方式和call一致
bind便于多次调用,apply,call每次调用都需要传递this和参数
注意事项:
非严格模式下,不传this,默认指向全局对象
严格模式下,不传this(上下文),指向null
手写call方法
Function.prototype.myCall = function (thisArg, ...arrs) {
const call = Symbol('call')
//这里不能简写,Symbol是唯一的,访问指定的Symbol需要用变量存储该Symbol
thisArg[call] = this;
//这里的this是函数对象,thisArg 是你传输的目标对象,thisArg[key]就相当于在给这个对象自身添加一个方法
const res = thisArg[call](...arrs);
//函数内部的this指向函数调用者,所以这里只能使用thisArg[key]ÿ