js中call、apply、bind方法的作用和区别


1. call方法

  • 作用:专门用于修改方法内部的 this 指向
  • 格式:xxx.call( 对象名, 参数1, 参数2 , ...);。即:将 xxx 方法的 this 指向为 对象名
  • 实例:
    javascript function test(a,b){ console.log(this); console.log(a + b); } test(1,2); // window 3 var obj = {name:'zjy'}; window.test.call(obj,3,5); // {name:'zjy'} 8
    解析:没有使用 call 方法时,test方法的this指向全局对象window,而当使用了call方法后,将test的this指向从window变成了obj对象,而后面的参数则是对应方法的形参顺序
    ***

    2. apply方法

  • 作用:和call方法一样也是修改方法内部的 this指向的,它们的区别在于apply的第二个参数必须为一个数组(部署了Iterator接口的类数组对象也可以)
  • 格式:xxx.apply( 对象名, [数组]);。即:将 xxx 方法的 this 指向为 对象名,数组中的元素依次与方法的形参对应
  • 实例:
    javascript function test(a,b){ console.log(this); console.log(a + b); } test(1,2); // window 3 var obj = {name:'zjy'}; window.test.apply(obj,[3,5]); // {name:'zjy'} 8
    解析:没有使用 apply 方法时,test方法的this指向全局对象window,而当使用了apply方法后,将test的this指向从window变成了obj对象,而后面的数组参数则是将数组中元素依次对应到test方法形参的位置
    ***

    3. bind方法

  • 作用:也是改变this的指向问题
  • 格式:xxx.bind( 对象名 , 参数1, 参数2 , ...);。即:将 xxx 方法的 this 指向为 对象名
  • 实例:
    javascript var obj = {key:"value"} var foo = function(){ console.log(this) } foo.bind(obj)() // obj
    解析:在没有使用bind方法时,foo()中的this指向的是全局对象window,而使用了bind方法之后则指向的是obj对象
    ***

    4. 真数组转变为类数组过程

  • 写法:
    var arr = [1,3,5];
    var obj = {};
    [].push.apply(obj,arr);     // { 0:1, 1:3 , 2:5 , length:3 }

5. 类数组转变为真数组过程

  • ES5写法:
    // 系统自带类数组对象
    var divs = document.querySelectorAll('div');
    // 自定义类数组对象
    var obj = {0:'zjy' , 1:18 , length:2};
    var arr = [];   //  真数组

    // 在高级的浏览器中使用如下的方法是可以实现类数组对象转换为真数组,但是在 IE8 及其以下是不行的
    // [].push.apply(arr,divs);
    // [].push.apply(arr,obj);
    // 为了兼容 IE8 及其以下的浏览器,需要使用数组的 slice 方法
    // 数组的 slice 方法不传递参数的时候是将数组中的元素依次遍历然后放到一个 新的数组 中原样返回
    var arr2 = [].slice.call(obj);
  • ES6写法:
    Array.from();方法用于将类数组对象和可遍历(Iterator)对象转换为真数组
    var obj = {0:'zjy' , 1:18 , length:2};
    var arr = Array.from(obj)   // ['zjy',18]

扩展运算符(...)也可以将可遍历(Iterator)对象转换为真数组

    [..document.querySelectorAll('div')]

apply、bind、call方法的作用与区别的更多相关文章

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

    从一开始,我是在书上看到关于bind().call() 和 apply(), 不过长久以来,在工作中与网上接触到了很多关于这三个方法的使用场景,对这三个方法也算是比较熟悉了.所以把他们的作用和区别简单 ...

  2. 有关java反射的几个小方法的作用和区别

    1.Class类中 getXXX()和getDeclaredXXX()的作用和区别: 前者获取某个类的所有公共(public)的字段(or方法or构造函数),包括父类.后者获取所有的字段(or方法or ...

  3. 跨域的几种方式以及call(),apply() bind()方法的作用和区别

    jsonp: jsonp 全称是JSON with Padding,是为了解决跨域请求资源而产生的解决方案,是一种依靠开发人员创造出的一种非官方跨域数据交互协议. 一个是描述信息的格式,一个是信息传递 ...

  4. call apply bind的作用及区别? 应用场景?

    call.apply.bind方法的作用和区别: 这三个方法的作用都是改变函数的执行上下文,换句话说就是改变函数体内部的this指向,以此来扩充函数依赖的作用域 1.call 作用:用于改变方法内部的 ...

  5. apply和call方法

    真伪数组转换 /* apply和call方法的作用: 专门用于修改方法内部的this 格式: call(对象, 参数1, 参数2, ...); apply(对象, [数组]); */ function ...

  6. JavaScript方法call、apply、caller、callee、bind的使用详解及区别

    一.call 方法 调用一个对象的一个方法,以另一个对象替换当前对象(其实就是更改对象的内部指针,即改变对象的this指向的内容). 即  “某个方法”当做“指定的某个对象”的“方法”被执行. Js代 ...

  7. JavaScript方法call,apply,caller,callee,bind的使用详解及区别

    一.call 方法 调用一个对象的一个方法,以另一个对象替换当前对象(其实就是更改对象的内部指针,即改变对象的this指向的内容). 即  “某个方法”当做“指定的某个对象”的“方法”被执行. Js代 ...

  8. js apply/call/caller/callee/bind使用方法与区别分析

    一.call 方法 调用一个对象的一个方法,以另一个对象替换当前对象(其实就是更改对象的内部指针,即改变对象的this指向的内容). Js代码 call([thisObj[,arg1[, arg2[, ...

  9. JavaScript中call,apply,bind方法的区别

    call,apply,bind方法一般用来指定this的环境. var a = { user:"hahaha", fn:function(){ console.log(this.u ...

随机推荐

  1. 使用eclipse Debug时总是被URLClassLoader这个类拦截,不能进入到要调试的类里面去

    打开Debug,如图去掉前面的两个对号,重新debug即可:

  2. SVN中忘记上传自己写的工程,但是IP已经变了的解决方案

    苦于自己没有养成每天下班上传SVN的好习惯,第二天来又发现IP变了,只得把自己写的删掉,记录一下解决方法: 第一个红框中的svn://192.168.0.103/FH是前一天的IP链接地址,结果发现今 ...

  3. Charles 下载

    本文参考:Charles 下载 Charles 下载 当前最新的版本是v4.2.8:官网下载页面:https://www.charlesproxy.com/latest-release/downloa ...

  4. Django-官网查询部分翻译(1.11版本文档)-QuerySet-字段查找-06

    目录 Making queries 进行查询 创建一个对象(一条数据记录) 保存修改的表对象 保存外键字段或多对多字段(ForeignKey or ManyToManyField fields) Re ...

  5. Docker详解(三)

    目录 1. Docker镜像 1.1 镜像存储 1.2 base镜像 1.3 镜像Commit 2. Docker容器数据卷 2.1 基本介绍 2.2 数据卷 2.3 数据卷容器 序言:前两章我们主要 ...

  6. EasyJson 发布

    JSON库很常用了,现在开源的JSON库也有很多.但是我们仍然面临下列问题 1)时不时的爆出这个Json库出现漏洞,那个json库出现漏洞.一旦出现漏洞只能升级,想切换JSON都不成. 2)一个项目中 ...

  7. [Spark] 02 - Practice Spark

    开发环境 教学视频:Spark的环境搭建,需安装配置环境:Java, Hadoop 环境配置:玩转大数据分析!Spark2.X+Python 精华实战课程(免费)[其实只是环境搭建] 进入pyspar ...

  8. JavaScript之时间对象Date

    时间是物理学七大常量之一.生活中记录时间有两种方式(或者说有两种计时系统):GMT(格林尼治时间)和UTC(协调世界时间). 一 创建Date对象 JS中的Date对象只能通过new关键字创建. va ...

  9. jvm对象内存分配

    一.jvm简单结构图 1.jvm内存对象分配整体流程: 1.类加载子系统和方法区 类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间.除了类的信息外, ...

  10. java处理emoji(转)

    最近对接ios.安卓客户端,需要处理emoji等表情符号,网上总结: 1.过滤掉emoji表情符 2.修改数据库的编码格式等,让其支持存储emoji 以下分别对两种方案进行描述: 第一种:过滤掉emo ...