apply,call,bind都是js给函数内置的一些api,调用他们可以为函数指定this的执行,同时也可以传参。
call
call 接收多个参数,第一个为函数上下文也就是this,后边参数为函数本身的参数。
let obj = { name: "一个" } function allName(firstName, lastName) { console.log(this) console.log(`我的全名是“${firstName}${this.name}${lastName}”`) } // 很明显此时allName函数是没有name属性的 allName(‘我是‘, ‘前端‘) //我的全名是“我是前端” this指向window allName.call(obj, ‘我是‘, ‘前端‘) //我的全名是“我是一个前端” this指向obj
apply
apply接收两个参数,第一个参数为函数上下文this,第二个参数为函数参数只不过是通过一个数组的形式传入的。
allName.apply(obj, [‘我是‘, ‘前端‘])//我的全名是“我是一个前端” this指向obj
bind
bind 接收多个参数,第一个是bind返回值返回值是一个函数上下文的this,不会立即执行。
let obj = { name: "一个" } function allName(firstName, lastName, flag) { console.log(this) console.log(`我的全名是"${firstName}${this.name}${lastName}"我的座右铭是"${flag}"`) } allName.bind(obj) //不会执行 let fn = allName.bind(obj) fn(‘我是‘, ‘前端‘, ‘好好学习天天向上‘) // 也可以这样用,参数可以分开传。bind后的函数参数默认排列在原函数参数后边 fn = allName.bind(obj, "你是") fn(‘前端‘, ‘好好学习天天向上‘)
实现call
1.call主要都做了些什么。
- 更改this指向
- 函数立刻执行