call/apply/bind 的理解与实例分享
call/apply
可以改变函数的this
指向。 除了传递参数时有所差别,call
和apply
作用完全一样。
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/apply
将getName
方法中的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 的理解与实例分享相关推荐
- JavaScript内置一些方法的实现原理--new关键字,call/apply/bind方法--前戏
new关键字,call/apply/bind方法都和this的绑定有关,在学习之前,首先要理解this. 一起来学习一下this吧 首先.this是一个对象. 对象很好理解,引用类型值,可以实现如th ...
- 复习javascript中call,apply,bind的用法
一直很难理解js中的call apply bind,在w3schools,mdn阅读了,也看了很多相关的文章,今天我来写下我理解的call apply bind 首先创建一个函数 function m ...
- 50行javaScript代码实现简单版的 call , apply ,bind 【中级前端面试基础必备】
在实现自己的call,apply,bind前,需要复习一下this. ###所谓的this其实可以理解成一根指针: 其实 this 的指向,始终坚持一个原理:this 永远指向最后调用它的那个对象,这 ...
- call,apply,bind,new实现原理
在实际开发过程中,对于函数封装时,不确定外部是谁调用的,调用函数内部方法时,有可能是window调用这时就会报错,常使用call,apply,bind来绑定this指向. Function.proto ...
- call(),apply(),bind()的用法及举例
通过学习call(),apply(),bind()的用法和区别,我们能更好的理解this及作用域的含义,为后面的编程打下基础. call()的用法: 调用一个函数,使其具有一个指定的this值和分别地 ...
- call / apply / bind
对于 call / apply / bind 来说,他们的首要目的是用于改变执行上下文的 this 指针. call / apply 对 call / apply 的使用,一般都如下,用于改变执行环境 ...
- JS函数方法Call Apply Bind运用
JS 函数非继承的call和apply方法 同:call & apply 主要是用于扩展this指向,降低this作用域与函数之间的耦合度: 区别:传参差异 function.call(thi ...
- Power Automate生产现场实例分享回顾
Power Automate生产现场实例分享回顾 8月28日(周五)19:30-21:00,Danfos智慧工厂数字化解决方案高级顾问Helena Wang通过Teams和B站为大家分享了Power ...
- JavaScript中的call,apply,bind学习总结
JavaScript 中的 call, apply, bind 这三个函数的作用和区别在各大论坛都被讨论了很多次了,但是我一直都还没来得及好好总结,这次正好看到了一个很不错的关于JavaScript ...
最新文章
- linux oracle修改编码utf8
- 绘图中的drawRect
- Android应用开发的一些规则
- C# WinForm获取 当前执行程序路径的几种方法
- 温州大学《深度学习》课程课件(十、人脸识别与神经风格迁移)
- ubuntu18.10安装linuxqq2.0
- 推辞掉得不是你的工作,而是你的未来
- TensorFlow Hub介绍:TensorFlow中可重用的机器学习模块库
- 【教育】斯坦福大学——人工智能本科4年课程清单
- 守护进程之PHP实现
- 文字识别(五)--自然场景文本检测技术综述(CTPN, SegLink, EAST)
- Design Pattern 设计模式【观察者】
- bzoj 2795	[Poi2012]A Horrible Poem hash+线性筛
- html5--select与HTML5新增的datalist元素
- 李峋同款的C语言动态爱心代码(终于不是html的啦)
- i9-10900K比9900K性能提升了多少?i9-10900K和i9-9900K区别对比评测
- java工程师怎么接私单_Java开发者如何接私活?
- Autorun病毒kocmbcd.exe分析
- Android判断当前系统语言
- python/appium实现华为应用商城app界面上下滑动打开关闭通知栏等功能