fn.call(obj,arg1,arg2,arg3) fn.apply(obj,[arg1,arg2,arg3]) fn.bind(obj,20,'中国‘)()
call、apply、bind可以将某个函数的this指向修改为传?这三个?法中的第?个参数,其中call、apply会?即执?,bind返回的是?个函数,需调?后执?。 第?个参数是传?要执?的?法中的参数,call、bind是独?传递参数,apply是以数组传递参数的
function sum(sum1, sum2) {
return sum1 + sum2
}
function sumApply1(sum1, sum2) {
return sum.apply(this, arguments)
return sum.apply(this, [sum1, sum2])
}
console.log(sumApply1(10,20))
function sum(sum1, sum2) {
return sum1 + sum2
}
function sumCall1(sum1, sum2) {
return sum.call(this, sum1, sum2)
}
console.log(sumCall1(10,20));
var color = 'red';
var o = {
color: 'blue'
}
function sayColor() {
console.log(this.color);
}
sayColor.call(this)
sayColor.call(window)
sayColor.call(o);
window.color = 'red'
var o = {
color: 'blue'
}
function sayColor() {
console.log(this.color)
}
var bindSayColor = sayColor.bind(o);
bindSayColor()
使?场景: 1、需要改变某个函数的this指向时 2、当参数较少时可以使?call,参数较多可以使?apply以数组的?式传递 3、当需要重复调?时,可以使?bind新定义?个?法
手写call apply bind: call和apply实现思路主要是: 1、判断是否是函数调用,若非函数调用抛异常 2、通过新对象(context)来调用函数 3、给context创建一个fn设置为需要调用的函数 4、结束调用完之后删除fn
Function.prototype.myCall = function (context) {
if (typeof this !== 'function') {
throw new TypeError("Not a Function")
}
context = context || window
context.fn = this
let args = Array.from(arguments).slice(1)
let result = context.fn(...args)
delete context.fn
return result
}
Function.prototype.myApply = function (context) {
if (typeof this !== "function") {
throw new TypeError("Not a Function")
}
let result
context = context || window
context.fn = this
if (arguments[1]) {
result = context.fn(...arguments[1])
} else {
result = context.fn()
}
delete context.fn
return result
}
bind实现思路: 1、判断是否是函数调用,若非函数调用抛异常 2、返回函数 3、判断函数的调用方式,是否是被new出来的 4、new出来的话返回空对象,但是实例的__proto__指向_this的prototype 5、完成函数柯里化Array.prototype.slice.call()
Function.prototype.myBind = function(context){
if(typeof this !== "function") {
throw new TypeError("Not a Function")
}
const _this = this
const args = Array.prototype.slice.call(arguments,1)
return function F () {
if(this instanceof F) {
return new _this(...args,...arguments)
}else{
return _this.apply(context,args.concat(...arguments))
}
}
}
|