三个方法(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(), 不过长久以来,在工作中与网上接触到了很多关于这三个方法的使用场景,对这三个方法也算是比较熟悉了.所以把他们的作用和区别简单 ...
随机推荐
- PAT(B) 1086 就不告诉你(Java)
题目链接:1086 就不告诉你 (15 point(s)) 题目描述 做作业的时候,邻座的小盆友问你:"五乘以七等于多少?"你应该不失礼貌地围笑着告诉他:"五十三.&qu ...
- Linux 服务器修改时间与时间同步
设置时间 date --set '2015-11-23 0:10:40' # 方法一,通用 timedatectl set-time '2015-11-23 08:10:40' # 容器内可能不支持 ...
- slot 组件的内部传值 v-slot 的使用
嵌套组件传值 person.vue <template> <div class="vslot-test"> <ul> <li v-for= ...
- Educational Codeforces Round 65 (Div. 2)
A.前n-10个有8即合法. #include<cstdio> #include<cstring> #include<iostream> #include<a ...
- Java Comparable与Comparator区别
1,两种接口的展示 下面的程序是两个类各自实现了Comparable接口.Comparator接口 package com.cnblogs.mufasa.Solution; import java.u ...
- TypeScript算法与数据结构-栈篇
本文的源码在这里,可以参考一下 栈也是一种使用非常广泛的线性数据结构,它具有后进先出last in first out的特点.通俗的例子就像我们平时一本一本的往上放书,等到我们又想用书时,我们首先接触 ...
- PimaIndiansdiabetes-数据预处理实验(一)
有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10859517.html 链接:https:// ...
- linux命令详解
命令语法介绍 命令 [参数] [文件或路径] rm -f /etc/hosts 注:命令和参数至少一个空格(可以多个连着写) 路径不带空格 ...
- java - day016 - IO续(输入输出), 手写双向链表
课程回顾 对象的创建过程 类加载 加载父类,父类的静态变量分配内存 加载子类,子类的静态变量分配内存 父类静态变量赋值运算, 和静态初始化块 子类静态变量赋值运算, 和子类初始化块 创建对象 创建父类 ...
- Tornado框架 源码基本分析
在python2 的环境中 pip install tornado==1.2.1 1.2.1版本Tornado源码少,利于了解. import tornado.ioloop import tornad ...