三个方法(apply、call、bind)
一、apply()和call()
- 方法中如果没传入参数,或者是null,那么调用该方法的函数对象中的this就是默认的window
<script>
function f1(x,y){
console.log(x+y+"======="+this)
}
f1.apply();//NaN=======[object Window]
f1.apply(null);//NaN=======[object Window]
f1.call();//NaN=======[object Window]
f1.call(null);//NaN=======[object Window]
</script>
- apply和call方法都可以让函数或者方法来调用,传入参数和函数自己调用的写法不一样,但是效果是一样的
<script>
function f1(x,y){
console.log(x+y+"======="+this)
}
f1(10,20);//30=======[object Window]
f1.apply(null,[10,20]);//30=======[object Window]
f1.call(null,10,20);//30=======[object Window]
</script>
- 作用:函数的调用,改变this的指向------在借用构造函数实现继承里也讲到过call方法
- 使用方法:只要想使用别的对象的方法,并且希望这个方法是当前对象
<script>
//作用,调用函数,改变this的指向
function Person(age){
this.age=age;
}
Person.prototype.sayHi=function(x,y){
console.log((x+y)+"=======>"+this.age);
};
function Student(age){
this.age=age;
}
var per=new Person(10);//Person的实例对象
var stu=new Student(100);//Student的实例对象
//sayHi方法是per实例对象原型里面的方法
//通过apply和call方法,stu调用了这个方法
//sayHi方法里面的this,由原来的per变成了stu
per.sayHi.apply(stu,[10,20]);//30=======>100
per.sayHi.call(stu,10,20);//30=======>100
//写法
//函数名字/方法.apply(对象,[参数1,参数2,.....])
//函数名字/方法.call(对象,参数1,参数2,.......)
</script>
- apply和call方法并不在函数这个实例对象中,而是在Function的原型prototype中
二、bind()
- bind方法是复制的意思,参数可以在复制的时候传进去,也可以在复制之后调用的时候传入进去
- bind是在复制的时候改变this指向的,二apply和call是在调用的时候改变this指向的
- 使用方法:
- 函数名字.bind(对象,参数1,参数2,...)------>返回复制后的函数
- 方法名字.bind(对象,参数1,参数2,...)------>返回复制后的方法
<script>
//使用方法:
//1.函数名字.bind(对象,参数1,参数2,...)------>返回复制后的函数
function f1(x,y){
console.log(x+y);
}
var f2=f1.bind(null,10,20);
f2();//30
//2.方法名字.bind(对象,参数1,参数2,...)------>返回复制后的方法
function Person(age){
this.age=age;
}
Person.prototype.show=function(){
console.log(this+"======"+this.age);
};
function Student(age){
this.age=age;
}
var per=new Person(10);
var stu=new Student(20);
//stu对象使用bind复制了一份per的方法
var ff=per.show.bind(stu);
ff();//[object Object]======20
</script>
- 应用:通过对象,调用方法,产生随机数
<script>
//构造函数
function showRandom(){
//1-10的随机数
this.number=parseInt(Math.random()*10+1);
}
//原型方法
showRandom.prototype.show1=function(){
//定时器里的this是window,通过bind把this指向改变成为了实例对象
window.setInterval(this.show2.bind(this),1000);
};
showRandom.prototype.show2=function(){
//显示随机数
console.log(this.number);
};
//实例对象
var sr=new showRandom();
//调用方法,输出随机数字,调用一次,可以不停的产生(相同的)随机数字
sr.show1();
</script>
- 补充:bind函数的用法
<script>
function fn(a,b,c,d,e,f){
console.log(a,b,c);
console.log(d,e,f);
}
// 绑定的同时传递参数,预传参,不调用
var newFn = fn.bind(this,1,2,3)
// 调用的时候传递参数,该参数会和预传递的参数合并到一起作为函数参数
newFn() //1 2 3 undefined undefined undefined
newFn(4,5,6) // 1 2 3 4 5 6
</script>
三个方法(apply、call、bind)的更多相关文章
- Javascript中call,apply,bind方法的详解与总结
在 javascript之 this 关键字详解 文章中,谈及了如下内容,做一个简单的回顾: 1.this对象的涵义就是指向当前对象中的属性和方法. 2.this指向的可变性.当在全局作用域时,thi ...
- 前端总结·基础篇·JS(三)arguments、callee、call、apply、bind及函数封装和构造函数
前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·JS(一)原型.原型链.构造函数和字符串(String) 前 ...
- 理解JS中的call、apply、bind方法(*****************************************************************)
在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:app ...
- 函数的属性和方法之call、apply 及bind
一.前言 ECMAScript中的函数是对象,因此函数也有属性和方法.每个函数都包含两个属性:length和prototype.每个函数也包含两个非继承来的方法:apply()和call(),还有一些 ...
- JS中的call、apply、bind方法详解
bind 是返回对应函数,便于稍后调用:apply .call 则是立即调用 . apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(co ...
- 继承:call、apply、bind方法
javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. call,apply,bind这 ...
- JavaScript中的call、apply、bind方法的区别
在JavaScript 中,this的指向是动态变化的,很可能在写程序的过程中,无意中破坏掉this的指向,所以我们需要一种可以把this的含义固定的技术,于是就有了call,apply 和bind这 ...
- js中改变this指向的call、apply、bind 方法使用
前言: 由于js 中this的指向受函数运行环境的影响,指向经常改变,使得开发变得困难和模糊,所以在封装sdk,写一些复杂函数的时候经常会用到this 指向绑定,以避免出现不必要的问题,call.ap ...
- call() 、 apply() 、bind()方法的作用和区别!
从一开始,我是在书上看到关于bind().call() 和 apply(), 不过长久以来,在工作中与网上接触到了很多关于这三个方法的使用场景,对这三个方法也算是比较熟悉了.所以把他们的作用和区别简单 ...
随机推荐
- STM32中引脚复用说明
端口复用的定义 STM32有许多的内置外设(如串口.ADC.DCA等等),这些外设的外部引脚都是和GPIO复用的.也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设 ...
- 地址解析协议(ARP)
地址解析协议(ARP) 地址解析协议(ARP)是指网络地址和MAC地址之间的转换 当一台主机需要向另一台主机发送数据时,需要知道目的主机的ip地址外还需要知道目的主机的mac地址.源主机首先会在自己的 ...
- PB在已经存在的datawindow中添加数据列的方法
打开数据窗口,点击Data按钮 进入到数据源定义画板,选择要新增的列后,不要保存文件,直接点关闭,在提示框选是就可以了 新增的列值存不到数据库中,如果需要更新数据库中的值则:需要在数据窗口画板下,点击 ...
- CentOS 7忘记了root密码解决方案
1.启动系统,在选择进入系统的界面按“e”进入编辑页面 2.按向下键,找到以“Linux16”开头的行,在该行的最后面输入“init=/bin/sh” 3.按“ctrl+X”组合键进入单用户模式 4 ...
- Fiddler抓取https原理
首先fiddler截获客户端浏览器发送给服务器的https请求, 此时还未建立握手.第一步, fiddler向服务器发送请求进行握手, 获取到服务器的CA证书, 用根证书公钥进行解密, 验证服务器数据 ...
- 如何做好PPT
为什么要做ppt 全图型PPT,一张大图做背景,少量的文字---PPT大师Garr Renolds极力推崇的风格 半图型PPT PTT是为了和你的"客户"有效的沟通 好的PPT G ...
- flutter从入门到精通三
flutter可以通过一套代码运行在多个平台上,包括移动,web,桌面,嵌入式,但是在 Web 平台的支持尚未达到 Beta 阶段,请不要用在生产环节,在阅读文档时候,推荐大家阅读https://fl ...
- 易优cms后台RCE以及任意文件上传漏洞
前言 EyouCms是基于TP5.0框架为核心开发的免费+开源的企业内容管理系统,专注企业建站用户需求提供海量各行业模板,降低中小企业网站建设.网络营销成本,致力于打造用户舒适的建站体验.易优cms ...
- vscode教程(基础篇)
转载:https://segmentfault.com/a/1190000017949680 本文主要介绍vscode在工作中常用的快捷键及插件,目标在于提高工作效率 本文的快捷键是基于mac的,wi ...
- 部署Java项目到阿里云服务器(Ubuntu16.04 64位)
生成Jar包 1.进入到项目所在的路径下,打开cmd命令控制台,使用如下命令打包项目. mvn package --前提将项目中使用的maven配置到系统的环境变量中 2.打包完成的jar包在项目目录 ...