JS中的bind 、call 、apply
# 一 、bind
特点:
### 1.返回原函数的拷贝,我们称这个拷贝的函数为绑定函数
### 2.将函数中的this固定为调用bind方法时的第一个参数,所以称之为绑定函数。注意是名词而非动词。
### 3.以后无论由哪个对象调用绑定函数,绑定函数中的this依然由当时调用的bind方法的一个参数决定,不会改变。
### 4.如果绑定函数作为构造函数来使用,那么已经固定了的this将不会生效,此时构造函数中的this依然为实例对象。
### 5.调用bind方法时的第二个参数做为绑定函数的第一个参数,称之为预设参数,调用绑定函数时的第一个参数则排在预设参数后面
### 6.无论使用任何对象调用bind方法时如果不传参数、第一个参数为undefined、第一个参数为null时,绑定函数中的this指向window对象
作用:
### 1.拷贝一个目标函数
### 2.改变绑定函数运行时的this指针
1-1 证明是原函数的拷贝 (需要知道:函数也是对象,并且是引用类型,比较的是内存地址)
```
function fn(){}
var bindFn = fn.bind(); //ƒ fn(){ return this } 供以后调用
fn === bindFn //false
<br>
<br>
2-1 将函数中的this固定为调用bind方法时的第一个参数
function fn(){ return this }
var bindFn = fn.bind({name:"绑定函数"}) //ƒ fn(){ return this }
<br>
<br>
3-1 以后无论由哪个对象调用绑定函数,绑定函数中的this依然是{name:"绑定函数"}
function fn(){ console.log(this) }
var bindFn = fn.bind({name:"绑定函数"})
bindFn() //等同于window对象调用 , this依然指向{name:"绑定函数"}
var obj = {name:"obj"};
obj.fn = bindFn;
obj.fn() //由普通对象调用 ,this依然指向{name:"绑定函数"}
var arr = [bindFn];
arr0 //由数组调用 , this依然指向{name:"绑定函数"}
setTimeout(bindFn , 200); //作为回调函数 , this依然指向{name:"绑定函数"}
clearTimeout(1);
<br>
<br>
4-1 如果绑定函数作为构造函数,已经捆绑的this会被忽略掉,this依然指向实例对象
function Person(name){
this.name = name;
}
var bindPerson = Person.bind({name:"绑定函数"})
new bindPerson("张三") // Person {name: "张三"}
<br>
<br>
5-1 预设参数
function fn(a,b,c,d){
console.log(a,b,c,d) // 1 ,2 ,3 ,4
}
var bindFn = fn.bind({name:"绑定函数"} , 1 ,2); // 拷贝原函数时的第2个参数开始往后称为预设参数
bindFn(3,4); //调用绑定函数时的第一参数则排在预设参数的后面
<br>
<br>
6-1 当没有参数、第一个参数为undefined、第一个参数为null时
var obj = {
fnOne:function(){ return this }.bind(),
fnTwo:function(){ return this }.bind( undefined ),
fnThree:function(){ return this }.bind( null )
}
//注意:这三种情况是使this指向window对象,而不是不去改变this指向,所以这里的this还是不会指向obj
obj.fnOne() // window
obj.fnTwo() //window
obj.fnThree() //window
<br>
<br>
<br>
# 二、call
特点:
### 1.返回值取决于目标函数的返回值
### 2.用call的第一个参数对象来代替调用目标函数的对象,以此来改变目标函数体内的this指向
### 3.调用call方法时的第二个参数做为目标函数的第一个参数,将第二个作为第三个以此类推
<br>
作用:
### 1.用于继承,例如子构造函数继承父构造函数
### 2.改变绑定函数运行时的this指针。
<br>
1-1 返回值取决于目标函数的返回值
function fn(){ return {name:"call"} }
fn.call() // {name: "call"}
<br>
<br>
2-1 改变目标函数体内的this指向 , 相当于使用第一个参数对象调用
function fn(){ return this }
fn.call( { name : "call" } ) // {name: "call"}
<br>
<br>
3-1 参数位置
function fn(a, b, c){ return arguments }
fn.call( { name : "call" } , 1 , 2 , 3 ) //Arguments [1, 2, 3]
<br>
<br>
1-2 用于继承
function parent(name, age) {
this.name = name;
this.age= age;
}
function child(name, age) {
parent.call(this, name, age);
this.class = '三年级二班';
}
var xiaoming = new child("小明" , 18)
<br>
<br>
<br>
# 三、apply
特点:
### 1.与call方法一样唯一不同的地方就是apply的第二个参数是一个数组,数组的第一个元素对应目标函数的第一个参数,以此类推
<br>
作用:
### 1.与call方法一样
<br>
1-1 参数
function fn(a, b, c){ return a+b+c }
fn.apply({name:"apply"} ,[1,2,3]) //6
<br>
<br>
<br>
## 总结
### 相同点
####1. 3个方法都是改变绑定函数运行时的上下文
### 不同点
####1.bind方法的返回值是原函数的拷贝,供以后调用 。参数既可以在拷贝时预设又可在调用时添加
####2.call与apply一样,返回值取决于目标函数的返回值 , 则是立即调用
####3.call与apply唯一的区别是call从第二个参数开始是若干个参数,而apply第二个参数是一个数组
JS中的bind 、call 、apply的更多相关文章
- js中的bind、apply、call、callee、caller的区别
1.bind.apply与call的区别与使用 相同点:2者是函数原型的一个方法,因此调用者都必须是函数,第1个参数都是对象.作用是,用另一个对象替换当前对象,另一对象也即是你传的第一个参数.通常用于 ...
- JS中的call、apply、bind方法
JS中的call.apply.bind方法 一.call()和apply()方法 1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]] ...
- js中的bind方法的实现方法
js中目前我遇见的改变作用域的5中方法:call, apply, eval, with, bind. var obj = { color: 'green' } function demo () { c ...
- js笔记——理解js中的call及apply
call及apply在js里经常碰得到,但一直感觉很陌生,不能熟练使用.怎样才能熟练应用呢? 为什么存在call和apply? 在javascript OOP中,我们经常会这样定义: function ...
- 关于 js 中的 call 和 apply使用理解
关于 js 中的 call 和 apply使用理解 在学习新的东西时候,碰到以前看过而又不理解,或则记忆不深的地方不妨回头看看书里知识点,有助于加深理解.正所谓--温故而知新. 废话不多说,直接上代码 ...
- 快速理解js中的call,apply的作用
今天被人问到js中的call,apply的区别和用途,解释了一番后,想到之前在逼乎上看到一位小伙伴生动形象的解释 本身不难理解,看下MDN就知道了,但是不常用,遇到了,还要脑回路回转下.或者时间长了, ...
- JS中的call()和apply()方法(转)
转自:http://uule.iteye.com/blog/1158829 JS中的call()和apply()方法 博客分类: JS 1.方法定义 call方法: 语法:call([thisOb ...
- 理解JS中的call、apply、bind方法(*****************************************************************)
在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:app ...
- js 中arguments,call,apply,bind的使用
//对于 arguments和this, 每个函数都有自己独有的arguments和this, 且不进行链式查找 //arguments是什么? //答:1:arguments是收到的实参副本 //2 ...
- js中的call、apply、bind
在js中每个函数都包含两个非继承而来的方法:call()和apply() call和apply的作用都是在特定的作用域中将函数绑定到另外一个对象上去运行,即可以用来重新定义函数的执行环境,两者仅在定义 ...
随机推荐
- 有赞透明多级缓存解决方案(TMC)设计思路
引子 TMC 是什么 TMC,即"透明多级缓存(Transparent Multilevel Cache)",是有赞 PaaS 团队给公司内应用提供的整体缓存解决方案. TMC 在 ...
- php安装igbinary扩展(windows)
pecl.php.net 是php的扩展仓库,访问此网站后,搜索需要安装的扩展,截图如下: igbinary: http://pecl.php.net/package/redis github的网址: ...
- 带"反悔"的贪心-超市
题面:https://www.acwing.com/problem/content/description/147/ 超市里有N件商品,每个商品都有利润pi和过期时间di,每天只能卖一件商品,过期商品 ...
- Spring源码阅读 之 搭建源码阅读环境(IDEA)
检出源码: GitHub:https://github.com/spring-projects/spring-framework.git 可以按如下步骤:(须确保Git已正确安装) Git正确安装后, ...
- SORM框架01
架构图 Query接口:负责查询(对外提供的核心服务类) QueryFactory类:负责根据配置信息创建Query对象 TypeConvertor接口:类型转换 TableContext类:负责获取 ...
- flink流处理从0到1
一.DataStream API之Data Sources(消费者之数据源) 介绍: source是程序的数据源输入,你可以通过StreamExecutionEnvironment.addSource ...
- python 基础知识4 - 字典
1.字典增 #字典增 dic = {'name': '大白', 'age': 20} dic['hight'] = 180 #没有键值对,添加 dic['age'] = 18 #有键值对,覆盖 pri ...
- 06JAVA面向对象之封装
一.面向对象 1.面向过程和面向对象 面向过程 分析问题的步骤,然后逐步实现. 面向对象 (1)面向对象基于面向过程 (2)面向对象是找出解决问题的人,然后分配职责. (3)对象中包含解决问题的步骤 ...
- javaweb学习之路(2)response
写一个简单的登录页面 1.创建一个login.jsp文件 主要内容: <form action="check.jsp" method="post"> ...
- layui批量传值到后台操作时出现传值为空的问题
如图,前台的样子,data的参数为 [ {"good_id":1,"good_name":"标样-总磷","good_num&qu ...