javascript中的每一个Function对象都有一个apply()和一个call()方法,它们的语法分别是:

/*apply()方法*/

function.apply(thisObj[, argArray])

apply: 调用一个对象的一个方法,用另一个对象替换当前对象。 例如: B.apply(A,arguments); 即A对象应用B对象的方法。

/*call()方法*/

function.call(thisObj[, arg1[, arg2[, [,...argN]]]]);

call: 调用一个对象的一个方法,用另一个对象替换当前对象。 例如:B.call(A,args1,args2);即A对象调用B对象的方法。

相同点:

1.方法的含义是一样的,功能自然也是一样的;

2.第一个参数的作用是一样的。

不同点:两者传入的列表形式不一样

1.call可以传入多个参数

2.apply只能传入两个参数,所以器第二个参数往往是作为数组的形式传入。

意义:

实现(多重)继承

实例代码:

function sum(num1,num2){

return num1+num2

}

function sub(num1,num2){

return num1-num2

}

var a1 = sum.apply(sub,[4,2])  // sub调用sum内的方法

console.log(a1) // 6

var a2 = sub.apply(sum,[4,2])  // sum调用sub内部的方法

console.log(a2) // 2

var c1 = sum.call(sub,4,2)      // sub调用sum的方法

console.log(c1) // 6

var c2 = sub.call(sum,4,2)  // sum调用sub内部的方法

console.log(c2) // 2

window.color = 'red';

var o = {color:'blue'}

function sayColor(){

console.log(this)

console.log(this.color)

}

console.log(this) // window

sayColor.call(this)    // window    red

sayColor.call(window)   // window    red

sayColor.call(o)        // {color:'blue'}  blue

sayColor.apply(this) // window red

sayColor.apply(window) // window    red

sayColor.apply(o)        // {color:'blue'}  blue

实现继承

function Animal(name){

this.name = name

this.showName = function(){

console.log(this.name)

}

}

function Cat(name){

Animal.apply(this,[name])

}

var cat = new Cat("猫")

cat.showName() //猫

// 多继承

function Sum(){

this.sumadd = function(a,b){

console.log(a+b)

}

}

function Sub(){

this.subadd = function(a,b){

console.log(a-b)

}

}

function Js(){

console.log(this)            //Js {}

Sum.apply(this)

Sub.apply(this)

}

var a = new Js();

a.sumadd(3,1) //4

a.subadd(3,1) //2

/*bind()方法*/

bind() 这个方法会创建一个函数实例,其this值会被绑定到传给bind()函数的值

var objSayColor = sayColor.bind(o) //{color:'blue'}

objSayColor() // blue

var a = {

user: 'skl',

}

var b = function(e,d,f){

console.log(this.user)  //skl

console.log(e,d,f)  //10,1,2

};

var c = b.bind(a,10)

c(1,2)

总结:call和apply都是改变上下文中的this并立即执行这个函数,bind方法可以让对应的函数想什么时候调就什么时候调用,并且可以将参数在执行的时候添加,这是它们的区别,根据自己的实际情况来选择使用。

call(),apply()和bind()的区别的更多相关文章

  1. JS 中的this指向问题和call、apply、bind的区别

    this的指向问题 一般情况下this对象指向调用函数的对象,全局环境中执行函数this对象指向window. function a(){ console.log(this); //输出函数a中的th ...

  2. this+call、apply、bind的区别与使用

    http://www.ruanyifeng.com/blog/2018/06/javascript-this.html https://segmentfault.com/a/1190000018017 ...

  3. 改变this指针的apply,call,bind的区别

    apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. Jav ...

  4. js中call、apply和bind的区别

    在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢.在说区别之前还是先总结一下三者的相似之处:1.都是用来改变函数的this对象的指向的.2.第一个参数都是this要指向的对 ...

  5. call和apply和bind的区别

    在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. JavaScript 的一大 ...

  6. 有关call和apply、bind的区别及this指向问题

    call和apply都是解决this指向问题的方法,唯一的区别是apply传入的参数除了其指定的this对象之外的参数是一个数组,数组中的值会作为参数按照顺序传入到this指定的对象中. bind是解 ...

  7. Javascript中call,apply,bind的区别

    一.探索call方法原理 Function.prototype.call = function(obj) { // 1.让fn中的this指向obj // eval(this.toString().r ...

  8. JS中call()和apply()以及bind()的区别

    一.方法定义: apply:调用一个对象的一个方法,用另一个对象替换当前对象.例如:B.apply(A, arguments);即A对象应用B对象的方法. call:调用一个对象的一个方法,用另一个对 ...

  9. 超容易理解的call()、apply()、bind()的区别

    call().apply().bind()是用来改变this的指向的. 一 举个例子 一个叫喵喵的猫喜欢吃鱼,一个叫汪汪的小狗喜欢啃骨头,用代码实现如下: 有一天,小狗汪汪和喵喵共进午餐的时候,汪汪说 ...

  10. apply,all,bind的区别

    这三个都是用来改变this指向的 call() 和apply()的第一个参数相同,就是指定的对象.这个对象就是该函数的执行上下文.call()和apply()的区别就在于,两者接收的参数不一样.cal ...

随机推荐

  1. 图像风格迁移(Pytorch)

    图像风格迁移 最后要生成的图片是怎样的是难以想象的,所以朴素的监督学习方法可能不会生效, Content Loss 根据输入图片和输出图片的像素差别可以比较损失 \(l_{content} = \fr ...

  2. 洛谷 P1494 [国家集训队] 小Z的袜子

    题目概述: 小Z把N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务 ...

  3. webpack-dev-server运行时报错

    注意:webpack 在进行打包时,利用webpack-dev-server进行打包启动时,应该对webpack-dev-server进行全局安装,不然也会报错,( cnpm install webp ...

  4. QTcpSever和QTcpSocket实现多线程客户端和服务端;

    QTcpServer提供了newConnection信号, 可以通过connect实现连接槽函数,利用nextPendingConnection 函数获取连接的QTcpSocket * :也可以继承Q ...

  5. C++: 模板函数定义与声明分离;

    我们知道模板函数或模板类的定义一般都是和声明一起在头文件中,但是这样的话, 就暴露了内部实现,有什么办法能够将定义和声明进行分离呢? 答案是: 有的: 头文件: test.h; class test ...

  6. 2018-2019 20165232 Exp5 MSF基础应用

    2018-2019 20165232 Exp5 MSF基础应用 一.原理与实践说明 1.实践内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 一个 ...

  7. ansible安装二进制kubernetes-1.14.1

    主机信息: 主机IP 主机名 角色 10.10.3.181 k8s-m1  kube-apiserver,kube-controller-manager,kube-scheduler,etcd 10. ...

  8. 快速掌握Nginx(四) —— Nginx日志切片和常用配置总结

    1.Nginx日志管理 1.日志简单介绍 Nginx提供了日志记录的功能,日志文件在对我们管理网站十分有用,通过访问日志(access_log)我们可以获取请求来源.客户端信息.请求的资源等信息:通过 ...

  9. 静态网站创建工具Docusaurus

    地址:https://docusaurus.io/docs/zh-CN/installation 安装 Docusaurus

  10. Linux基础 - 基本命令

    一.Linux系统命令操作语法格式 二.目录操作 创建目录 查看目录 改变当前的目录/位置 打印当前工作目录 三.创建文件或者修改文件时间戳(文件属性) 四.stat命令 vim 查看文件内容 mor ...