jsapply和call的作用和区别,js apply和call的区别

jsapply和call的作用和区别,js apply和call的区别,详解js中的apply与call的用法

在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 5strict模式中,本例中的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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: