call/apply 可以改变函数的this指向。 除了传递参数时有所差别,callapply作用完全一样。

var tim = { name: 'tim', age: 20, getName: function() {console.log(this.name);return this.name; }
}var jake = { name: 'jake', age: 20 }tim.getName(); // tim// jake对象没有getName方法,但是可以通过call/apply去使用tim对象的getName方法
tim.getName.call(jake);  // jake
tim.getName.apply(jake); // jake

tim.getName.call(jake)的意思是执行getName方法,但是通过call/applygetName方法中的this指向强行设置为jake对象。因此最终的返回结果会是jake。

call apply的不同之处在于传递参数的形式。其中apply传递的参数为数组形式, call传递的参数为按顺序依次排列。一个简单的实例说明。

// 当参数个数不确定或者你觉得用apply比较爽时, 就直接使用apply
// 字面解释就是obj夺舍fn,obj拥有了执行fn函数的能力,并且this指向obj.
var arguments = { 0:'name', 1:'age', 2:'gender' };fn.apply(obj, arguments);
fn.call(obj, name, age, gender);

下面我收集了几个我遇到过的实际例子

  • 将类数组形式转换为数组
// arguments
// 返回值为数组,arguments保持不变
var arg = [].slice.call(arguments);// nodeList
var nList = [].slice.call(document.getElementsByTagName('li'));
  • 方法借用
var foo = {name: 'joker',showName: function() {console.log(this.name);}
};
var bar = {name: 'rose'
};foo.showName.call(bar); // rose
  • 在继承中的应用
// parent
var Person = function(name) {this.name = name;this.gender = ['man', 'woman'];
}// child
var Student = function(name, age) {// inheritPerson.call(this);
}
Student.prototype.message = function() {console.log('name:'+this.name+', age:'+this.age+', gender:.'+this.gender[0]);
}var xm = new Student('xiaom', 12);
xm.message(); //name:undefined, age:undefined, gender:.man
  • 封装对象时保证this指向
var Nicco = function(name) {this.name = name;
}
Nicco.prototype = function() {constructor: Nicco,message: function() {var _this = this;addEventListener('mousedown',function() {// stay thisreturn _this.fndown.call(_this);},false);},fndown: function() {var_this = this,str = this.name + ', i miss you.';addEventListener('mouseup',function() {return _this.fnup.call(_this, str);},false);},fnup: function(str) {console.log(str);}
}

call/apply/bind 的理解与实例分享相关推荐

  1. JavaScript内置一些方法的实现原理--new关键字,call/apply/bind方法--前戏

    new关键字,call/apply/bind方法都和this的绑定有关,在学习之前,首先要理解this. 一起来学习一下this吧 首先.this是一个对象. 对象很好理解,引用类型值,可以实现如th ...

  2. 复习javascript中call,apply,bind的用法

    一直很难理解js中的call apply bind,在w3schools,mdn阅读了,也看了很多相关的文章,今天我来写下我理解的call apply bind 首先创建一个函数 function m ...

  3. 50行javaScript代码实现简单版的 call , apply ,bind 【中级前端面试基础必备】

    在实现自己的call,apply,bind前,需要复习一下this. ###所谓的this其实可以理解成一根指针: 其实 this 的指向,始终坚持一个原理:this 永远指向最后调用它的那个对象,这 ...

  4. call,apply,bind,new实现原理

    在实际开发过程中,对于函数封装时,不确定外部是谁调用的,调用函数内部方法时,有可能是window调用这时就会报错,常使用call,apply,bind来绑定this指向. Function.proto ...

  5. call(),apply(),bind()的用法及举例

    通过学习call(),apply(),bind()的用法和区别,我们能更好的理解this及作用域的含义,为后面的编程打下基础. call()的用法: 调用一个函数,使其具有一个指定的this值和分别地 ...

  6. call / apply / bind

    对于 call / apply / bind 来说,他们的首要目的是用于改变执行上下文的 this 指针. call / apply 对 call / apply 的使用,一般都如下,用于改变执行环境 ...

  7. JS函数方法Call Apply Bind运用

    JS 函数非继承的call和apply方法 同:call & apply 主要是用于扩展this指向,降低this作用域与函数之间的耦合度: 区别:传参差异 function.call(thi ...

  8. Power Automate生产现场实例分享回顾

    Power Automate生产现场实例分享回顾 8月28日(周五)19:30-21:00,Danfos智慧工厂数字化解决方案高级顾问Helena Wang通过Teams和B站为大家分享了Power ...

  9. JavaScript中的call,apply,bind学习总结

    JavaScript 中的 call, apply, bind 这三个函数的作用和区别在各大论坛都被讨论了很多次了,但是我一直都还没来得及好好总结,这次正好看到了一个很不错的关于JavaScript ...

最新文章

  1. linux oracle修改编码utf8
  2. 绘图中的drawRect
  3. Android应用开发的一些规则
  4. C# WinForm获取 当前执行程序路径的几种方法
  5. 温州大学《深度学习》课程课件(十、人脸识别与神经风格迁移)
  6. ubuntu18.10安装linuxqq2.0
  7. 推辞掉得不是你的工作,而是你的未来
  8. TensorFlow Hub介绍:TensorFlow中可重用的机器学习模块库
  9. 【教育】斯坦福大学——人工智能本科4年课程清单
  10. 守护进程之PHP实现
  11. 文字识别(五)--自然场景文本检测技术综述(CTPN, SegLink, EAST)
  12. Design Pattern 设计模式【观察者】
  13. bzoj 2795 [Poi2012]A Horrible Poem hash+线性筛
  14. html5--select与HTML5新增的datalist元素
  15. 李峋同款的C语言动态爱心代码(终于不是html的啦)
  16. i9-10900K比9900K性能提升了多少?i9-10900K和i9-9900K区别对比评测
  17. java工程师怎么接私单_Java开发者如何接私活?
  18. Autorun病毒kocmbcd.exe分析
  19. Android判断当前系统语言
  20. python/appium实现华为应用商城app界面上下滑动打开关闭通知栏等功能

热门文章

  1. ENGINEER 003:配置IPv6地址
  2. Android学习笔记---Material Design设计理念
  3. springMVC和Shiro框架整合使用简单示例 【转】
  4. 智能&大数据时代,架构师思维的十个学习步骤(优化版)
  5. homework-04
  6. 配置Fedora15 x86_32
  7. 推荐阅读20101115
  8. 购物价值观(values of shopping)
  9. oracle数据库学习相关笔记-转换函数
  10. 网页自适应和响应式的区别与分析总结