call、apply、bind 改变this指向
Fn.call('this指向',参数,参数,参数 ) 立即执行 参数一个一个传
Fn.apply('this指向',[参数,参数,参数] ) 立即执行 参数放在数组中传
Fn.bind('this指向',参数,参数,参数 ) 不立即执行,返回该函数 参数一个一个传
var name = 'qiaodan'
var person = {
getName: function () {
console.log(this)
return this.name
}
}
var person1 = {
name: 'kebi'
}
//person.getName.myCall(person1,1,2,3)
//实现手写call
Function.prototype.myCall = function (context) {
if (typeof this !== 'function') { //this为person.getName的函数
throw new Error('error')
}
context = context || window //person1对象
var args = [...arguments].slice(1)
//改变方法的this指向传入的传入的属性 给方法复制给传入的对象
context.fn = this
var result = context.fn(...args)
return result
}
//实现手写apply person.getName.myApply (person1,[1,2,3])
Function.prototype.myApply = function (context) {
if (typeof this !== 'function') { //this为person.getName的函数
throw new Error('error')
}
context = context || window
//改变方法的this指向传入的传入的属性 给方法复制给传入的对象
context.fn = this
let result
if (arguments[1]) {
result = context.fn(...arguments[1])
} else {
result = context.fn()
}
delete context.fn
return result
}
//实现手写bind person.getName._bind(person1,1,2,3)
function _bind() {
const args = Array.prototype.slice.call(arguments) //转换为数组
const _this = args.shift() //this 跟 其他参数 分离
const self = this //this为person.getName的函数
return function () {
return self.apply(_this, args)
}
}