call bind apply的作用,js继承call和apply
本文主要描述了JS函数的调用、应用和绑定方法的超详细说明。感兴趣的朋友可以参考以下,希望能帮到你。
目录
JS函数调用、应用和绑定方法1、call()方法1、call()方法的模拟实现2、apply()方法1、apply()方法的模拟实现
三。bind()方法1。bind()方法4的模拟实现。摘要
JS 函数的 call、apply 及 bind 方法
一、call() 方法
调用call()方法将从010到59000执行目标函数,并在函数内部改变这个方向。这是由方法的第一个参数决定的,从010到59000的任何参数都会作为目标函数的参数一一对应的传入。
/*正常模式*/
让obj={
总和(a,b) {
console.log(this)
返回a b
}
}
//执行sum函数的apply和bind方法,打印出来的this如下。
Obj.sum.call() //打印窗口
Obj.sum.call(undefined,1,2) //打印窗口
Obj.sum.call(null,1,2) //打印窗口
/*严格模式*/
使用严格
//执行sum函数的apply和bind方法,打印出来的this如下。
Obj.sum.call() //打印未定义的
Obj.sum.call(undefined,1,2) //打印未定义的
Obj.sum.call(null,1,2) //打印null
1、call()方法的模拟实现
立即
逐个列举方法被添加到函数原型对象中。当目标函数调用这个方法时,myCall()方法中的this将指向目标函数。
目标函数是作为上下文对象的方法执行的,所以目标函数内部的这个将指向上下文对象。
从上下文对象中删除目标函数
使用扩展运算符关键点: 处理引入目标函数的参数。
在call()、apply()和bind()方法的模拟实现中,当第一个参数没有传递或者传递了undefined或null时,JS普通模式和strict模式是统一的,即目标函数中的this都指向window对象。
myCall()
function . prototype . my call=function(上下文,args) {
if(上下文===未定义上下文===空){
上下文=窗口
}
//下面的行为核心代码
上下文. fn=this
常量结果=context.fn(.参数)
删除上下文。fn
回送结果
}
设obj1={
基本单位:1,
总和(a,b) {
console.log(this)
归还这个
}
}
设obj2={
基本单位:9
}
console.log(obj1.sum.call(obj2,2,3)) //14
console . log(obj 1 . sum . my call(obj 2,2,3)) //14
二、apply() 方法
调用apply()方法将立即执行目标函数,并在函数内部改变目标函数的方向。这是由方法的第一个参数决定的,第二个参数是... 。每个数组元素或arguments对象所表示的参数将作为目标函数的参数一一对应地传入。
1、apply()方法的模拟实现
代码如下:
myApply()方法被添加到函数原型对象中。当目标函数调用这个方法时,myApply()方法中的this将指向目标函数。
目标函数是作为上下文对象的方法执行的,所以目标函数内部的这个将指向上下文对象。
从上下文对象中删除目标函数
使用扩展运算符.处理传入目标函数的参数。
参数数组或 arguments 对象
function . prototype . myapply=function(context,args) {
if(上下文===未定义上下文===空){
上下文=窗口
}
//下面的行为核心代码
上下文. fn=this
常量结果=context.fn(.参数)
删除上下文。fn
回送结果
}
console . log(obj 1 . sum . apply(obj 2,[2,3])//14
console . log(obj 1 . sum . my apply(obj 2,[2,3])//14
三、bind() 方法
调用bind()方法将返回新函数3354的目标函数的副本。这个在函数内部指向方法的第一个参数,任何一个一个枚举的参数都会一一对应的作为目标函数的参数传入。之后,执行新功能就相当于执行目标功能。
bind()方法实现了函数的科里化,所以可以向目标函数传递两次参数。第一个参数列在bind()方法的第一个参数之后,第二个参数列在new函数中。
1、bind() 方法的模拟实现
关键点:
myBind()方法被添加到函数原型对象中。当目标函数调用这个方法时,这个myBind()方法内部将指向目标函数。
目标函数是作为上下文对象的方法执行的,所以目标函数内部的这个将指向上下文对象。
从上下文对象中删除目标函数
使用扩展运算符.处理输入目标函数的初始参数和后续参数。
代码如下:
function . prototype . my bind=function(上下文.initArgs) {
if(上下文===未定义上下文===空){
上下文=窗口
}
//缓存该值
const _this=这个
返回函数(.args) {
//下面的行为核心代码
context.fn=_this
常量结果=context.fn(.initArgs,参数)
删除上下文。fn
回送结果
}
}
console.log(obj1.sum.bind(obj2,2)(3)) //14
console . log(obj 1 . sum . my bind(obj 2,2)(3)) //14
四、总结
三种方法的异同:
关键点:可以在执行目标功能时改变内部this的方向。
方法的第一个参数用于在执行函数时指定此的内部值。
支持向目标函数传递任意参数。
如果不向方法的第一个参数传递值或undefined或null,在JavaScript普通模式下,target函数中的this指向window对象,在strict模式下,它分别指向undefined和null。
代码如下:
apply()方法可以接收两个参数,而call()和bind()方法可以接收多个参数。
apply()方法在向目标函数传递参数时,只需要将参数数组或arguments对象作为方法的第二个参数,而call()和bind()方法则需要逐个列出参数。
当调用call()和apply()方法时,将立即执行目标函数,而bind()方法则不会。它会返回一个新函数的目标函数的副本3354,其中this指向bind()方法的第一个参数,然后执行新函数就相当于执行目标函数。
只有bind()方法实现了函数科里化,所以可以向目标函数传递两次参数。
以上是JS函数的call、apply、bind方法的细节。关于JS函数的调用、应用和绑定方法的更多信息,请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。