js手写call,apply,bind方法
Function.prototype.myCall = function(thisArg, ...args) {
var fn = this
thisArg = (thisArg !== null && thisArg !== undefined) ? Object(thisArg) : window
thisArg.fn = fn
var result = thisArg.fn(...args)
delete thisArg.fn
return result
}
function foo() {
console.log('foo调用', this)
}
function sum(num1, num2) {
console.log('sum调用', this)
return num1 + num2
}
foo.myCall('abc')
var sumData = sum.myCall('sum', 10, 20)
console.log(sumData)
foo.myCall(0)
Function.prototype.myApply = function(thisArg, argArray) {
var fn = this
thisArg = (thisArg !== null && thisArg !== undefined) ? Object(thisArg) : window
thisArg.fn = fn
argArray = argArray || []
var result = thisArg.fn(...argArray)
delete thisArg.fn
return result
}
function sum(num1, num2) {
return num1 + num2
}
function foo() {
console.log('foo')
}
var result2 = sum.myApply('abc', [20, 30])
console.log(result2)
foo.myApply('abc')
Function.prototype.myBind = function(thisArg,...argArray) {
var fn = this
thisArg = (thisArg !== null && thisArg !== undefined) ? Object(thisArg) : window
function proxyFn(...args) {
thisArg.fn = fn
var finalArgs = [...argArray, ...args]
var result = thisArg.fn(...finalArgs)
delete thisArg.fn
return result
}
return proxyFn
}
function sum(num1, num2, num3, num4) {
var sum = num1 + num2 + num3 + num4
console.log(num1, num2, num3, num4)
return sum
}
var newSum = sum.myBind('abc', 10, 20)
var result = newSum(30, 40)
console.log(result)