在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语言(一种计算机语言,尤用于创建网站)描述语言有所帮助。