call和apply的作用和区别

call和apply用来调用函数,并用指定对象(第一个参数)替换函数的 this 值,同时用指定数组替换函数的参数。注:也可以不指定参数,此时只是单纯的调用函数,如:fun.call()

语法:

  fun.call(thisobj,arg1,arg2) ;当后面参数个数确定时用call,参数之间用逗号连接

  fun.apply(thisobj,[arg1,arg2]);当后面参数个数不确定时用apply,参数通过数组形式输入

call和apply的作用:

  改变this的指向,第一个参数为你要传入的对象,传入后函数的this就指向了这个对象,后面的参数为你为函数传递的参数值

简单案例:

var str=‘js‘;
function fo(){
  var str=‘jq‘;
  console.log(this.str);//此时this指向window
  console.log(this===window);
  console.log(this===obj);
  //输出js,true,false
}
fo();
var obj={
  str:‘html‘
};
fo.call(obj)//输出html,false,true,这就证明了call将fo的this指向改为了obj;
var ob={
  str:‘css‘,
}
var get=function(){
  console.log(str);//js 此时读取的是全局变量的值
  console.log(this.str);//css 此时this指向了ob,返回的就是ob.str
}
get.call(ob)

复杂案例:

function log(){
  var args=Array.prototype.slice.call(arguments);//将参数转为数组

  //slice(start,end(非必须) )方法可从已有的数组中返回选定的元素。

  //Javascript函数中的参数对象arguments是个对象,而不是数组。但它可以类似数组那样通过数字下表访问其中的元素,而且它也有length属性标识它的元素的个数。通常我们把它转换成数组用Array的slice函数,示例代码如下:function fn() { var arr = Array.prototype.slice.call(arguments,0);}

  //所以Array.prototype.slice.call(arguments)就是将参数转为数组然后返回数组

  console.log(args);//Array [ "hello", "world" ]
  args.unshift(‘(gykj)‘);//unshift(a,b,c)向数组的开头添加至少一个元素
  console.log(args);//Array [ "(gykj)", "hello", "world" ]
  console.log.apply(console,args);//(gykj) hello world 这里的apply可以将数组元素作为字符参数输出

  //由于参数个数不确定这里只能使用apply
}
log(‘hello‘,‘world‘)

时间: 2024-12-29 23:58:33

call和apply的作用和区别的相关文章

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

call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法都有call, apply属性.既然作为方法的属性,那它们的使用就当然是针对方法的了.这两个方法是容易混淆的,因为它们的作用一样,只是使用方式不同. 相同点:他们的作用都是相同的 不同点:他们的参数不同 call(this,arg1,arg2,arg3); apply(this,argum

call() 、 apply() 、bind()方法的作用和区别!

从一开始,我是在书上看到关于bind().call() 和 apply(), 不过长久以来,在工作中与网上接触到了很多关于这三个方法的使用场景,对这三个方法也算是比较熟悉了.所以把他们的作用和区别简单阐述一下! javaScript权威指南上的解释是: call() .apply()可以看作是某个对象的方法,通过调用方法的形式来间接调用函数.bind() 就是将某个函数绑定到某个对象上. 关于call() 和 apply() 在犀牛书上的解释可能比较生涩难懂,我的理解就是,它们的作用是: 让函数

call和apply和bind的区别

在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」. apply(): 将函数作为指定对象的方法来调用,传递给它的是指定的参数数组function.apply(thisobj, args) 或者 function.apply(thisobj, args) 1.thisobj

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

apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念. 先来一个栗子: 1 2 3 4 5 6 7 8 9 10 11 function fruits() {}   fruits.prototype = {     color: "red&qu

Javascript中call方法和apply方法用法和区别

第一次在博客园上面写博客,知识因为看书的时候发现了一些有意思的知识,顺便查了一下资料,就发到博客上来了,希望对大家有点帮助. 连续几天阅读<javascript高级程序设计>这本书了,逐渐发现了以前很多自己完全没有用过甚至见过的神奇知识点.今天在阅读到有关函数的属性和方法的时候,略感高级,于是乎,查阅了不少他人的博客,在此总结一下这两个方法的以下几个方面: 1.call()和apply()的作用和用法 2.什么时候用apply(),什么时候用call() 书上提到,每个函数都包含两个非继承而来

call和apply的作用和不同

相同点: call和apply的作用都是改变this关键字,让当前的函数执行,把里面的this关键字进行改变 区别: call在传递参数的时候是一个个的传,apply在传递参数的时候,是把需要传递的参数放在一个数组中一起传进去. 为什么函数可以调用call和apply方法: Function 是js中所有函数数据类型对应的基类.call和apply就定义在Function这个基类的原型上.

瞬间记住Javascript中apply与call的区别

关于Javascript函数的apply与call方法的用法,网上的文章很多,我就不多话了.apply和call的作用很相似,但使用方式有区别 apply与call的第一个参数都是一个对象,这个对象就是用来掉包函数中本身的this指向的,也就是替身. 从第2个参数开始,就是传递给这个函数的参数了.apply与call的区别就在这个参数形式上,一个是把所有参数放进一个数组,一个是依次写出即可. 首先说明下:apply接受数组形式的参数集,call是依次写出参数. 蛋疼的是我经常记不住到底是appl

&lt;转&gt; apply 和 call 的区别

原味地址:https://github.com/lin-xin/blog/issues/7 apply 和 call 的区别 ECMAScript 规范给所有函数都定义了 call 与 apply 两个方法,它们的应用非常广泛,它们的作用也是一模一样,只是传参的形式有区别而已. apply( ) apply 方法传入两个参数:一个是作为函数上下文的对象,另外一个是作为函数参数所组成的数组. var obj = { name : 'linxin' } function func(firstName

js中call、apply和bind的区别

前言 关于js中call.apply和bind这三者的区别,这应该是一个老生常谈的问题,也是前端面试时经常会遇到的一道题目,因此也抽空把它理一遍. 作用 call.apply和bind都是一个javascript中的方法,他们的共同作用就是改变函数执行时的上下文,即改变函数执行时this的指向.我们来看下面的例子: 1 function Animal(name) { 2 this.name = name; 3 } 4 Animal.prototype.getName = function() {