在ECAMScript3中,为函数的原型定义了两种方法。分别是Function.prototype.call和Function.prototype.apply本文详细介绍了apply和call的用法,有需要可以参考一下。
前言
call 和 apply 的存在是为了改变context ,即函数运行时的上下文。换句话说,就是为了改变函数体内部 this 的指向。
call 和 apply的功能完全一样,只是接受参数的方式不同。
方法定义
apply
Function.apply(obj,args)方法可以接收两个参数:
obj:此对象将替换函数类中的此对象。
args:这是数组或类数组。apply方法将该集合中的元素作为参数传递给被调用的函数。
call
call方法的第一个参数与apply方法相同,只是第二个参数是一个参数表。
在非严格模式中,当我们的第一个参数被传递为null或未定义时,函数体中的this将指向默认的宿主对象,而在浏览器中,它将是window。
var test=function(){
console . log(this===window);
}
test.apply(空);//真
test.call(未定义);//真
用法
"劫持"别人的方法
此时,foo中的logName方法将被bar引用,this指向bar。
var foo={
姓名:'明明',
日志名:函数(){
console . log(this . name);
}
}
var bar={
姓名:“王晓”
};
foo . logname . call(bar);//王晓
实现继承
功能动物(名称){
this.name=name
this.showName=function(){
console . log(this . name);
}
}
功能类别(名称){
Animal.call(这个,名字);
}
var cat=新猫('黑猫');
cat . showname();//黑猫
在实际开发中,我们经常会遇到这一点被不经意改变的场景。
有一个本地的fun方法。当fun作为普通函数调用时,fun内部的this指向window,但我们往往希望它指向这个#test节点。请参见以下代码:
window.id=' window
document . query selector(# test)。onclick=function(){
console . log(this . id);//测试
var fun=function(){
console . log(this . id);
}
fun();//窗口
}
我们使用call,apply就可以轻松解决这个问题。
window.id=' window
document . query selector(# test)。onclick=function(){
console . log(this . id);//测试
var fun=function(){
console . log(this . id);
}
fun.call(这个);//测试
}
当然,你也可以这样做,但是在ECMAScript 5的strict模式中,本例中的this已经被规定为undefined:,而不是指向全局对象。
window.id=' window
document . query selector(# test)。onclick=function(){
var that=this
console . log(this . id);//测试
var fun=function(){
console . log(that . id);
}
fun();//测试
}
函数func(){
'使用严格'
警戒(这个);//输出:未定义
}
func();
其他用法
类数组
这里,满足以下条件的对象称为类数组。
1.具有长度属性。
2.按索引存储数据。
3.无数组的push、pop等方法
常见的类数组是arguments,NodeList!。
(函数(){
array . prototype . push . call(arguments,4);
console.log(参数);//[1, 2, 3, 4]
})(1,2,3)
所以把一个4推进arguments。
Array.prototype.push页面可以实现两个数的组合。
同样,push方法不提供push的数组,但是提供了push(param1,param,…paramN),所以也可以通过应用来安装和更改这个数组,即:
var arr1=新数组(' 1 ',' 2 ',' 3 ');
var arr2=新数组(' 4 ',' 5 ',' 6 ');
array . prototype . push . apply(arr 1,arr 2);
console . log(arr 1);//['1', '2', '3', '4', '5', '6']
也可以这样理解,arr1调用push方法,参数是apply组装的参数表集合。
再比如我想求类数组中的最大值
(函数(){
var maxNum=Math.max.apply(null,参数);
console . log(maxNum);//56
})(34,2,56);
判断类型
console . log(object . prototype . tostring . call(123))//[对象编号]
console . log(object . prototype . tostring . call(' 123 ')//[对象字符串]
console . log(object . prototype . tostring . call(Undefined))//[对象未定义]
控制台。日志(对象。原型。托斯特林。call(true))//[object布尔值]
控制台。日志(对象。原型。托斯特林。调用({ })//[Object Object]
控制台。日志(对象。原型。托斯特林。调用([])//[对象数组]
控制台。日志(对象。原型。托斯特林。call(Function(){ })//[对象函数]
以上就是应用与呼叫的用法总结的全部内容,欢迎大家积极留言参加讨论,也希望本文对大家学习Java语言(一种计算机语言,尤用于创建网站)描述语言有所帮助。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。