首页 > 其他分享 >call()与apply()的作用与区别

call()与apply()的作用与区别

时间:2023-05-19 15:38:18浏览次数:37  
标签:console name 区别 person person1 call apply


1. 概念

  • 每个函数都包含两个非继承而来的方法:apply()和call()。
  • call与apply都属于Function.prototype的一个方法,所以每个function实例都有call、apply属性;

2. 作用

  • call()方法和apply()方法的作用相同:改变this指向。

3. 区别

  • 他们的区别在于接收参数的方式不同:
  • call():第一个参数是this值没有变化,变化的是其余参数都直接传递给函数。在使用call()方法时,传递给函数的参数必须逐个列举出来。
  • apply():传递给函数的是参数数组

4. 应用

var name = "Evan";
  var age = 20;

  var person = {
    name: "Hillary",
    age: 19,
    sayIntroduce: function () {
      return (
        "Hello, My name is " + this.name +" and I'm " +this.age +" years old."
      );
    },

    sayHobby: function (val1, val2) {
          return "I'm " + this.name + ", I like " + val1 + " and " + val2 + ".";
    },
  };

  
  var person1 = {
    name: "Coy",
  };

  
  console.log(person.sayIntroduce()); 
  // Hello, My name is Hillary and I'm 19 years old.
  
  // 当我们通过 call 和 apply 来this的指向时,不传任何参数,则默认为将this指向修改为 windows
  
  console.log(person.sayIntroduce.call()); 
  // Hello, My name is Evan and I'm 20 years old.
  console.log(person.sayIntroduce.apply()); 
  // Hello, My name is Evan and I'm 20 years old.
  
  // 有参数时,this 指向第一个参数:将this指向 person1,
  由于person1中没有age属性,因此为 undefined
  console.log(person.sayIntroduce.call(person1)); 
  // Hello, My name is Coy and I'm undefined years old.
  
  console.log(person.sayIntroduce.apply(person1)); 
  // Hello, My name is Coy and I'm undefined years old.
  
  // 当需要传递参数时,call可以直接写多个参数,apply需要用数组方式传递:
  console.log(person.sayHobby.call(person1, 'swimming', 'hiking')); 
  // I'm Coy, I like swimming and hiking. 

  console.log(person.sayHobby.apply(person1, ['swimming', 'hiking'])); 
  // I'm Coy, I like swimming and hiking.


标签:console,name,区别,person,person1,call,apply
From: https://blog.51cto.com/u_16120408/6312729

相关文章

  • flvjs使用过程中报The play() request was interrupted by a call to pause()的原因和
    原因:从表层来看,它的原因是因为在播放出来视频之前就已经被调用了pause方法停止了。但是造成这个过程的真正原因是什么呢?资源加载不成功可能是你的接口写错了,导致没有资源,虽然这是一个很小的可能,但是千万不要忽视每一个小的点时机不对这个时候就是说可能你接口是对的,只是获取......
  • v-bind和v-modal的区别
    1、v-bind(1)v-bind是单向数据绑定,用来绑定数据和属性以及表达式,数据只能从data流向页面;(2)v-bind的缩写是“:”,也就是v-bind:id等价于:id(3)适用于class、style、value2、v-model(1)v-modal是双向数据绑定,用在表单控件上,用于实现双向数据绑定(放在表单之外的标签上是没有效果的)(2)适......
  • Restful和WebService区别
    简介Restful是一种架构风格,其核心是面向资源,更简单;而webService底层SOAP协议,主要核心是面向活动;两个都是通过web请求调用接口RESTful是什么REST就是(REpresentationalStateTransfer单词太长记不住就对了)是一种构架风格,REST指的是一组架构约束条件和原则。满足这些约......
  • 多路复用IO模型和非阻塞IO模型的区别?
    常见的LinuxIO模型:阻塞IO模型:当应用程序调用read或write等IO操作时,如果内核没有准备好数据,那么应用程序就会一直阻塞等待,直到内核准备好数据后才会返回。在这种模型下,应用程序通常只能同时处理一个连接,效率较低。非阻塞IO模型:当应用程序调用read或write等IO操作后,如果内核没有......
  • 交换机、集线器、路由器和网桥的区别
    交换机、集线器、路由器和网桥是计算机网络中常见的网络设备,它们在网络中发挥不同的作用并位于不同的层次。下面是它们的区别和各自所在的层次:1.集线器(Hub)区别:集线器是一种简单的网络设备,用于将多个计算机连接在一起形成一个局域网。它的主要功能是将接收到的数据包广播到所有......
  • i7 13700f和i7 13700kf区别 i713700f和i713700kf参数对比
    酷睿i7-13700F采用intel7制程工艺性能核+能效核的高性能混合构架,拥有16核24线程,包括8个性能核心以及8个能效核心,最高睿频可达5.2GHz,同时配备24MBL2缓存以及36MBL3缓存,原生支持DDR5-5600、5200高频内存,无内置核显,需搭配独立显卡使用组装电脑选i713700f还是i713700kf怎么搭配......
  • h610和b660区别 h610和b660哪个好
    内存超频的区别:B660主板是支持内存超频的,H610不支持内存超频,但对于i3-12100f是不算区别的。12代不带k的处理器都锁SA电压不能超,一般稳不了3600gear1。而H610m的主板本身最高支持3200MHz频率内存,也达到了i312100f的上限。因此,虽然H610不支持内存超频,但对于i312100f是不影响的。......
  • TLS1.2握手流程分析(RSA,ECDHE),和TLS1.3区别
    目录一、加密算法简介1.2RSA简要流程1.1ECDHE简要流程二、TLS1.2握手消息简介三、TLS1.2RSA流程四、TLS1.2ECDHE流程五、TLS1.2和TLS1.3区别5.1更快的访问速度5.2更强的安全性六、wareshark抓包验证TLS1.2流程6.1搭建httpsserver(springboot)6.2请求并抓包6.3抓包结果分......
  • Java中==和equals的区别
    在Java中“==”和“equals()”都是用于比较两个对象是否相等,但是他们之间还是有着许多不同之处。两者的区别“==”是一个操作符,用于比较两个操作数的值是否相等。如果操作数为值类型,比较的是值是否相等,如果操作数为引用类型,比较的是地址值是否相等。“equals()”是一个定义在Ob......
  • b660主板和z690哪个好 b660和z690区别
    Z690系列主板全面CPU升级供电,引入PCIe5.0技术,其中支持PCIe5.0的插槽还额外采用4个坚固的固定针脚设计,以更好的支撑显卡的重量。主板选z590还是z690怎么搭配更合适这些点很重要http://www.adiannao.cn/du所有微星Z690主板的PCB板都升级为服务器级的PCB板,MEG系列主板更采用了铝背......