三个方法(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(), 不过长久以来,在工作中与网上接触到了很多关于这三个方法的使用场景,对这三个方法也算是比较熟悉了.所以把他们的作用和区别简单 ...
随机推荐
- golang 上传文件(包括 gin 实现)
golang web服务有时候需要提供上传文件的接口,以下就是具体示例.为了示例简单(吐槽下 golang 的错误处理), 忽略了所有的错误处理.本文会用两种方式(标准库和gin)详细讲解 golan ...
- Python之Django
一.Django是一个开放源代码的Web应用框架,由Python写成.采用了MTV的框架模式,即模型M,视图V和模版T.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CM ...
- 8. Java的运算符
计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量. 我们把运算符具体分为:算数运算符,比较运算符,逻辑运算符,位运算符,赋值运算符,条件运算符,i ...
- 【转载】C#将字符串中字母全部转换为大写或者小写
在C#的编程开发过程中,有时候判断字符串是否相等时,并不关注字母的大小写,此时在C#中可以使用ToUpper方法将字符串中所有的字母转换为大写,使用ToLower方法可以将字符串中所有字母转换为小写. ...
- rsync 进行本地拷贝
带杠还是不带杠 带杠表示拷贝目录里面的内容不包括目录本身 重要的是源路径带不带杠,目标路径没关系 rsync -az /root/test/src/ /root/test/dest/ rsync -a ...
- EWA不能及时通过邮件接收
1. 确保EWA已经配置成功.可以通过SW_workcenter查看 2.确保EWA的邮箱设置成功 3. 检查EWAreport产生的时间 卫星系统:SDCCN 在tab"done" ...
- stm32内联汇编
首先,先看一下mdk下的混合编程的基本方法: 使用如上方法就可以进行混合编程了. 但是要特殊注意一点,个人感觉这个是直接调用一个代码段,并非一个函数,因为他不会保护调用这个代码段之前的现场.比如: 在 ...
- Mac下多版本JDK安装及管理
在Java项目中,经常对JDK版本有不同的要求,可是不可能为了某个项目的运行重新下载不同版本JDK进行安装,这样就涉及到对本地环境中多个JDK版本的管理. Mac的JDK都是安装到一个指定目录的:/L ...
- Linux 之 搜索
locate - 文件名搜索命令 用于查找文件 格式为:locate 文件名 该命令用于查找符合条件的文件,它会去保存文件与目录名称的数据库内,查找合乎范本样式条件的文件或目录. 因为该命令是直接在数 ...
- CentOS7下编译安装Python3.7.x【亲测有效】
所有操作都在root用户下操作 下载安装包 编译安装 建立软链接 验证 安装: 更新yum: yum update 安装Python依赖: yum install openssl-devel bzip ...