点击上方蓝色字体轻松关注

前言

经典模式题:call、apply 与 bind的区别。来吧,今天搞一搞。

call(thisArgs [,args...])

该方法可以传递一个thisArgs参数和一个参数列表,thisArgs指定了函数在运行期的调用者,也就是函数中的this对象,而参数列表会被传入调用函数中。thisArgs的取值有以下4种情况:

(1) 不传,或者传null,undefined, 函数中的this指向window对象

(2) 传递另一个函数的函数名,函数中的this指向这个函数的引用

(3) 传递字符串、数值或布尔类型等基础类型,函数中的this指向其对应的包装对象,如 String、Number、Boolean

(4) 传递一个对象,函数中的this指向这个对象

function a(){    console.log(this); //输出函数a中的this对象}function b(){} //定义函数bvar obj = {name:'onepixel'}; //定义对象obja.call(); //windowa.call(null); //windowa.call(undefined);//windowa.call(1); //Numbera.call(''); //Stringa.call(true); //Booleana.call(b);// function b(){}a.call(obj); //Object

这是call的核心功能,它允许你在一个对象上调用该对象没有定义的方法,并且这个方法可以访问该对象中的属性

var a = {    name:'onepixel', //定义a的属性    say:function(){ //定义a的方法        console.log("Hi,I'm function a!");    }};function b(name){    console.log("Post params: "+ name);    console.log("I'm "+ this.name);    this.say();}b.call(a,'test');>>Post params: testI'm onepixelI'm function a!

当执行b.call时,字符串test作为参数传递给了函数b,由于call的作用,函数b中的this指向了对象a, 因此相当于调用了对象a上的函数b,而实际上a中没有定义b 。

apply(thisArgs[,args[]])

apply和call的唯一区别是第二个参数的传递方式不同,apply的第二个参数必须是一个数组,而call允许传递一个参数列表。值得你注意的是,虽然apply接收的是一个参数数组,但在传递给调用函数时,却是以参数列表的形式传递,我们看个简单的例子:

function b(x,y,z){    console.log(x,y,z);}b.apply(null,[1,2,3]); // 1 2 3

bind(thisArgs [,args...])

bind是ES5新增的一个方法,它的传参和call类似,但又和call/apply有着显著的不同,即调用call或apply都会自动执行对应的函数,而bind不会执行对应的函数,只是返回了对函数的引用。粗略一看,bind似乎比call/apply要落后一些,那ES5为什么还要引入bind呢?

其实,ES5引入bind的真正目的是为了弥补call/apply的不足,由于call/apply会对目标函数自动执行,从而导致它无法在事件绑定函数中使用,因为事件绑定函数不需要我们手动执行,它是在事件被触发时由JS内部自动执行的。而bind在实现改变函数this的同时又不会自动执行目标函数,因此可以完美的解决上述问题,看一个例子就能明白:

var obj = {name:'onepixel'};/*** 给document添加click事件监听,并绑定onClick函数* 通过bind方法设置onClick的this为obj,并传递参数p1,p2*/document.addEventListener('click',onClick.bind(obj,'p1','p2'),false);//当点击网页时触发并执行function onClick(a,b){    console.log(            this.name, //onepixel            a, //p1            b  //p2    )}

当点击网页时,onClick被触发执行,输出onepixel p1 p2, 说明onClick中的this被bind改变成了obj对象

后记

以上就是小编今天给大家分享的内容,喜欢的小伙伴记得收藏转发,点击在看推荐给更多的小伙伴。

大前端实践者,专注于大前端技术领域,分享前端系统架构,框架实现原理,最新最高效的技术实践!

关注大前端实践者,学习前端不迷路,欢迎多多留言交流...

大前端实践者

方法apply作用于对象sort时失败_浅析call、apply 与 bind相关推荐

  1. vba mysql 80004005_Access运行时错误'-2147467259(80004005)':方法'Controls'作用于对象'CommandBarPopup'时失败的解决方法...

    时 间:2014-10-09 09:23:11 作 者: 摘 要:Access运行时错误'-2147467259(80004005)':方法'Controls'作用于对象'CommandBarPopu ...

  2. 方法range作用于对象worksheet时失败_VB.NET Excel操作类(获取工作簿列表和工作表列表及工作表对象)...

    效果展示 引用excel类 Imports Microsoft.Office.Interop Excel类代码开始 Public Class Cls_excel 返回Excel对象 ''' ''' 返 ...

  3. java 对象的定义是_浅析Java编程中类和对象的定义

    1,什么是类? 答:类是客观存在的,抽象的,概念的东西. 2,什么事对象? 答:对象是具体的,实际的,代表一个事物.例如:车是一个类,汽车,自行车就是他的对象. 关于类与对象的描述:类是对象的模版,对 ...

  4. python抓取数据时失败_爬取数据缺失的补坑,Python数据爬取的坑坑洼洼如何铲平...

    渣渣业余选手讲解,关于爬取数据缺失的补坑,一点点关于Python数据爬取的坑坑洼洼如何铲平,个人的一些心得体会,还有结合实例的数据缺失的补全,几点参考,仅供观赏,如有雷同,那肯定是我抄袭的! 在使用P ...

  5. mysql 回滚失败_浅析Mysql 数据回滚错误的解决方法

    MYSQL的事务处理主要有两种方法.1.用begin,rollback,commit来实现begin 开始一个事务 rollback 事务回滚 commit 事务确认 2.直接用set来改变mysql ...

  6. Javascript Array对象 sort()方法,记忆方法,方法扩展

    相信 有很多 同仁们,尤其是初学者,在记住 Array对象 sort() 方法的排序,规则上,有点困难: 其实sort()方法已经在实际工作中用到很多遍了,可当我仔细推敲,这个sort()方法,什么时 ...

  7. 类和对象运行时在内存里是怎么样的?各种变量、方法在运行时是怎么交互的?

    转载自   类和对象运行时在内存里是怎么样的?各种变量.方法在运行时是怎么交互的? 在回答这个问题之前先了解一下Java的一些基础知识. 我们知道Java程序运行在虚拟机环境里,那我们先看一下虚拟机的 ...

  8. php access ole相片,access2007对'位图图像'对象的操作失败.OLE服务器也许尚未注册。若要注册OLE服务器,必须重新安装它。--的解决方法...

    时 间:2012-03-14 12:24:51 作 者: 摘 要:对'位图图像'对象的操作失败.OLE服务器也许尚未注册.若要注册OLE服务器,必须重新安装它.--的解决方法 正 文: 网友 AK47 ...

  9. 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败解决方法

    最近在处理一个项目时使用到了在word中写入信息的功能,由于系统原来就支持在线打印功能,使用了PageOffice,于是就研究了一下PageOffice,发现Pageoffice不能满足自己的功能(或 ...

最新文章

  1. 深入浅出,机器学习该怎么入门?
  2. 三摄正普及,四摄在路上?谷歌逆天AI算法,只做单摄虚化
  3. yii2手动添加图片处理插件Imagine
  4. Android系统Surface机制的SurfaceFlinger服务的启动过程分析
  5. 监控调优工具详细参数整理
  6. 二级考试java模拟考试_2017年计算机二级考试Java模拟试题及答案
  7. 【K8S】Docker向私有仓库拉取/推送镜像报错(http: server gave HTTP response to HTTPS client)
  8. 单位元转换万元怎么转_PDF转CAD怎么转换
  9. 少年三国志鸿蒙符碎片在哪里,《少年三国志》最新萌新基础介绍4(名将+兵符)...
  10. dll创建及调用(VS2005)
  11. 三、optimizer_trace分析
  12. js实现对树深度优先遍历与广度优先遍历
  13. nodejs EADDRINUSE API拒绝访问
  14. 微信小程序自动化测试——智能化 Monkey
  15. dokuwiki之新增/删除页面(文章)(一)
  16. pygame:超级玛丽
  17. 【论文笔记】Resolution Adaptive Networks for Efficient Inference (CVPR2020)
  18. C语言,函数没有return,返回类型就是void的么?
  19. 筑梦品牌:推动品牌建设致力于打造好中国品牌
  20. html5 放风筝,萧山5个放风筝绝佳地

热门文章

  1. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
  2. 模拟namenode挂掉利用secondary namenode恢复
  3. iframe引用页面中的js操作父窗口标签
  4. 【ASP.NET Core】处理异常(上篇)
  5. 最多7次比较解决5个数的排序问题的解法
  6. jQuery使用blur()方法触发两次的解决方法
  7. xml中1字节的UTF-8序列的字节1无效([字符编码]Invalid byte 1 of 1-byte UTF-8 sequence终极解决方案)
  8. sublime_REPL使用及安装教程(解决Sublime无交互问题)
  9. [转]html5: postMessage解决跨域和跨页面通信的问题
  10. Oralce Plsql 中文显示乱码问题无需修改注册表完美解决