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

apply和call

js中的调用apply和call方法可以改变某个函数执行的上下文环境,也就是可以改变函数内this的指向值。

例子:

var person={
name:'aa',
getName:function(){
console.log(this.name);
}
}
var person2 = {
name:'bb'
} person.getName();
person.getName.call(person2);
person.getName.apply(person2);

person2中没有getName()方法,但是person2想执行getName()方法,就可以使用apply或call方法来借用person中的getName()方法。

当一个对象A没有某个方法时,其他对象B有该方法,就可以使用call或apply来借用对象B中的这个方法。这个时候就动态的改变了this的值。

apply,call二者区别

二者作用相同,区别是传入参数的方法不同。

例子:

var person={
name:'aa',
getName:function(){
console.log(this.name);
},
getPerson:function(age,sex){
this.age = age;
this.sex = sex;
console.log(this)
}
}
var person2 = {
name:'bb'
} person.getName();
person.getName.call(person2);
person.getName.apply(person2); person.getPerson.call(person2,'1','男');
person.getPerson.apply(person2,['2','女']);

call()和apply()方法的参数中,第一个参数是指定的上下文环境或者指定的对象,call()方法中后面的所有参数都是用逗号表示,apply()方法中所有参数都是用数组表示。如果参数数量确定,可以使用call方法,如果数量不确定,则使用apply方法。

bind()方法

bind() 方法与 apply 和 call 很相似,也是可以改变函数体内 this 的指向。

MDN的解释是:bind()方法会创建一个新函数,称为绑定函数,当调用这个绑定函数时,绑定函数会以创建它时传入 bind()方法的第一个参数作为 this,传入 bind() 方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。

语法:

var bound = fun.bind(this,arg1,arg2...);

如果只是想改变上下文环境,而非执行该函数,则使用bind方法。apply/call会马上执行该函数。

总结:

apply,call,bind都是改变函数的this指向的,改变函数执行的上下文环境。

apply,call,bind第一个参数指this需要指向的对象,也就是函数运行时所处的对象环境。

bind返回新的函数,但是不执行,apply/call会立即执行该函数。

参考:

http://www.cnblogs.com/coco1s/p/4833199.html

JS之apply,call,bind区别的更多相关文章

  1. call和apply和bind区别

    call和apply特征一样 都是用来调用函数 立即调用 但是可以在调用函数的同时 通过第一个参数指定函数内部this的指向 call 调用的时候 参数必须以参数列表的形式进行传递 也就是以逗号分隔的 ...

  2. apply,call,bind区别

    js中有三个改变this指针的方法,分别是 apply,call,bind.很多人只知道能改变的this,但是具体的适用场景不是太清楚.我也是遇到坑后不断的实践发现了区别. call ,apply方法 ...

  3. javascript中apply,call,bind区别,bind兼容等问题总结

    1 三者的相似之处: (1).都是用来改变函数的this对象的指向的 (2).都是用第一个参数来做this对象的指向 (3).都可以传参数进去 那么,具体到它们有什么区别呢?请看下面的例子: 两个对象 ...

  4. call(),apply(),bind()区别?

    每个函数都包含两个非继承而来的方法,apply()和call(),这两方法的用途都是在特定的作用域中调用函数,实际上等于设置函数数体内的this对象的值. apply()和call()第一个参数都一样 ...

  5. call、apply、bind 区别

    1.为什么要用 call .apply? 为了 改变方法里面的属性而不去改变原来的方法 function fruits() {} fruits.prototype = { color: "r ...

  6. JS中用apply、bind实现为函数或者类传入动态个数的参数

    为纪念10年没写blog,第一篇博文就以这样一个有趣的窍门开始吧 -___- 在ES5中,当我们调用一个函数时,如果要传入的参数是根据其他函数或条件判断生成的,也就是说不确定会传入多少个参数时,在不改 ...

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

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

  8. js中的call,apply,bind区别

    在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:app ...

  9. js中call、apply和bind到底有什么区别?

    介绍 在js中,每个函数的原型都指向Function.prototype对象(js基于原型链的继承).因此,每个函数都会有apply,call,和bind方法,这些方法继承于Function. 它们的 ...

随机推荐

  1. Gradle安装

    最近在学Android,而Android是由Gradle来构建的:Gradle是一个基于 JVM 的构建工具.所以开始学习Android之前,先进行Gradle安装与学习: mac: 使用SDKMAN ...

  2. iOS实现(超级猜图)源码

    //首先建立模型文件 QLLQuestion.hheQLLQuestion.m文件 #import <Foundation/Foundation.h> @interface QLLQues ...

  3. 远离腰痛的好方法——如何锻炼腰背部肌肉?

    在我们的骨科门诊中最常见到的就是腰痛患者:引起腰痛的原因很多,也比较复杂,所以就有俗语"病人腰痛.医生头痛"一说.其实,相当大部分的腰痛症状都是跟腰背部后方的肌肉筋膜劳损或者无菌性 ...

  4. 菜鸟教程 Python100例 之实例29

    学习编程的路,走得好艰辛... 为了巩固基础知识,把菜鸟教程网上的实例拿来练习.. 在做到实例29时,看了网站给出的代码,觉得可以加强一下功能,不由得动了一下脑筋,如下: 原文题目: 题目:给一个不多 ...

  5. 使用 ServiceStack.Text 序列化 json 比Json.net更快

    本节将介绍如何使用ServiceStack.Text 来完成高性能序列化和反序列化操作. 在上章构建高性能ASP.NET应用的几点建议 中提到使用高性能类库,有关于JSON序列化的讨论. 在诊断web ...

  6. Oracle与SQL SERVER编程差异分析(入门)

    网上有关Oracle与SQL SERVER性能差异的文章很多,结论往往是让你根据数据量与预算来选择数据库.但实际项目中,特别是使用 .Net 开发的系统,支持以上两种数据库或者更多已经成为Boss的普 ...

  7. ECharts 之一——入门

    一.简介 ECharts是一个来自百度的开源的javascript图标库.通过ECharts我们可以呈现出多种类型的图表.ECharts底层基于ZRender(一个全新的轻量级canvas类库),创建 ...

  8. hdu 2048 神、上帝以及老天爷(错排)

    神.上帝以及老天爷 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  9. Maven使用笔记,错误Failure to Transfer后处理

    当有未更新成功的项,M3会以后缀为.lastUpdated保存未更新成功的项 执行下面的操作可清楚这些项 Unixfind ~/.m2 -name "*.lastUpdated" ...

  10. Linux command’s Array

    #数组的声明与遍历 animals=("a dog" "a cat" "a fish") #wrong ways to use this f ...