call与apply都可以改变js的this指向,两者最主要的区别就是使用时传参的不同,apply的参数可以以数组的形式传进来,但是call方法的参数必须要一个一个的传进来,就像这样。

func.call(this, arg1, arg2);
var arr= [arg1, arg2];
func.apply(this,arr);

可以看出call与apply主要有两个参数,第一个是改变this的指向,如下:

function log(){
console.log(this.color);
} var obj={
color:"red"
}; log.call(obj);

这里的输出结果就是red,当然,我们还可以使用

log.apply(obj);

这两种方式都改变了this的指向,使得log方法的this变成obj,从而输出red。这是call与apply的一种用法,除了改变this指向之外,我们还可以给原本的方法传入参数。

var arr1=[1,2,3];
var arr2=[5,6,9];
Array.prototype.push.apply(arr1,arr2);
console.log(arr1);

[ 1, 2, 3, 5, 6, 9 ]

这里的用法就是先把数组的push方法的this指向了arr1,然后把arr2作为push方法的参数传了进来,所以才会输出arr1的时候的值是arr1和arr2的合并。这个例子也说明了apply方法和call之间的区别。apply传进去的是arr2整个数组,而如果使用call方法则必须把这个数组的元素一个个的拆开传进去。接着我们来继续看例子:

var arr1=[1,2,3];
var max=Math.max.apply(null,arr1);
console.log(max); 3

这次我们做的是找出数组中的最大值,需要注意的是这个例子中我们的第一个参数写的是null,那是因为这里并没有改变this的指向,而是借用了max这个方法使用在arr1的参数中。再看,这次我们想写个log函数,输出传进来的内容。

function log(v){
console.log(v)
}
log(1);
log(1,2); 1
1

这种写法是不行的,因为当我们传的参数不止一个的时候就出问题了,剩下的都无法输出,解决办法之一就是使用apply。

function log(){
console.log.apply(null,arguments)
}
log(1);
log(1,2); 1
1 2

我们还可以这样写

function log(){
var len=arguments.length;
for(var i= 0;i<len;i++) {
console.log(arguments[i]);
}
}
log(1,2,3); 1
2
3

至于bind方法,看个例子

var obj={
color:"red"
};
function log(){
console.log(this.color)
}
var func=log.bind(obj);
func(); red

所以,可以把bind理解为绑定this值。

最后引用一段coco大神的总结

  • apply 、 call 、bind 三者都是用来改变函数的this对象的指向的;
  • apply 、 call 、bind 三者第一个参数都是this要指向的对象,也就是想指定的上下文;
  • apply 、 call 、bind 三者都可以利用后续参数传参;
  • bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用 。

call、apply以及bind的更多相关文章

  1. JS核心系列:浅谈 call apply 与 bind

    在JavaScript 中,call.apply 和 bind 是 Function 对象自带的三个方法,这三个方法的主要作用是改变函数中的 this 指向,从而可以达到`接花移木`的效果.本文将对这 ...

  2. Javascript中call,apply,bind方法的详解与总结

    在 javascript之 this 关键字详解 文章中,谈及了如下内容,做一个简单的回顾: 1.this对象的涵义就是指向当前对象中的属性和方法. 2.this指向的可变性.当在全局作用域时,thi ...

  3. JS中call、apply、bind使用指南,带部分原理。

    为什么需要这些?主要是因为this,来看看this干的好事. box.onclick = function(){ function fn(){ alert(this); } fn();}; 我们原本以 ...

  4. Javascript中call、apply、bind函数

    javascript在函数创建的时候除了自己定义的参数外还会自动新增this和arguments两个参数 javascript中函数也是对象,call.apply.bind函数就是函数中的三个函数,这 ...

  5. 图解call、apply、bind的异同及各种实战应用演示

    一.图解call.apply.bind的异同 JavaScript中函数可以通过3种方法改变自己的this指向,它们是call.apply.bind.它们3个非常相似,但是也有区别.下面表格可以很直观 ...

  6. js里function的apply vs. bind vs. call

    js里除了直接调用obj.func()之外,还提供了另外3种调用方式:apply.bind.call,都在function的原型里.这3种方法的异同在stackoverflow的这个答案里说的最清楚, ...

  7. JS之apply,call,bind区别

    为了加深对基础知识的理解,今天再复习下js中的apply,call,bind的区别和用法.整理笔记的过程也是一个再次学习的过程. apply和call js中的调用apply和call方法可以改变某个 ...

  8. JavaScript中call、apply、bind、slice的使用

    1.参考资料 http://www.cnblogs.com/coco1s/p/4833199.html   2.归结如下 apply . call .bind 三者都是用来改变函数的this对象的指向 ...

  9. JS中的控制函数调用:call(),apply()和bind()

    所有的函数都具有call(),apply()和bind()方法.它们可以在执行方法的时候用一个值指向this,并改变面向对象的作用域. apply方法: 以下的两种表达式是等价的: func(arg1 ...

  10. JS中的call、apply、bind方法

    JS中的call.apply.bind方法 一.call()和apply()方法 1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]] ...

随机推荐

  1. ARPU_百度百科

    ARPU_百度百科 ARPU

  2. unity3d大型手游 可以打包obb文件

    用unity3d开发手游,有个很大的问题就是apk的size太大, 如果超过50M,一般很多平台就不会肯上线. 一个好的方法是把app打成apk + obb数据包的方式. 1. 编译成obb数据包的方 ...

  3. easui tree载入时自动展开无子节点的节点

    利用loadFilter对后台返回的原始数据进行过滤处理,将数据中的state字段修改相应的值,若无子节点,则改成open,若有子节点,则改成closed. 由于一个node属性只有下面几项内容,因此 ...

  4. Failed to load the JNI shared library

    解决Eclipse无法打开"Failed to load the JNI shared library" 这是由于JDK配置错误所导致的现象. 一般说来,新购笔记本会预装64位的w ...

  5. js 易错点

    如下代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  6. Mirantis OpenStack HA

    Mysql使用Galera做Active/Active集群,同时使用Pacemaker,因为Galera mysql用到了领导机选举机制quorum,所以控制节点至少三个 RabbitMQ使用mirr ...

  7. shell的wc命令统计 head tail命令详解

    Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项]文件... 2.命令功能: 统计指定文件中的字节数. ...

  8. ascii码所有字符对照表(包含汉字和外国文字)

    http://www.0xaa55.com/thread-398-1-1.html看到了0xaa55的这个帖子,想起了2年前我在51cto发的一个帖子http://down.51cto.com/dat ...

  9. JavaScript 的数组操作--删除元素

    在JavaScript中,可以很方便的删除指定位置的元素,这个是用到 splice方法, 该方法用于删除或替换数组中的部分数据. 其语法定义是 : splice(start , count [,new ...

  10. 神奇的矩阵 NOI模拟题

    神奇的矩阵 题目大意 有一个矩阵\(A\),第一行是给出的,接下来第\(x\)行,第\(y\)个元素的值为数字\(A_{x-1,y}\)在\(\{A_{x-1,1},A_{x-1,2},A_{x-1, ...