# 一 、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的更多相关文章

  1. js中的bind、apply、call、callee、caller的区别

    1.bind.apply与call的区别与使用 相同点:2者是函数原型的一个方法,因此调用者都必须是函数,第1个参数都是对象.作用是,用另一个对象替换当前对象,另一对象也即是你传的第一个参数.通常用于 ...

  2. JS中的call、apply、bind方法

    JS中的call.apply.bind方法 一.call()和apply()方法 1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]] ...

  3. js中的bind方法的实现方法

    js中目前我遇见的改变作用域的5中方法:call, apply, eval, with, bind. var obj = { color: 'green' } function demo () { c ...

  4. js笔记——理解js中的call及apply

    call及apply在js里经常碰得到,但一直感觉很陌生,不能熟练使用.怎样才能熟练应用呢? 为什么存在call和apply? 在javascript OOP中,我们经常会这样定义: function ...

  5. 关于 js 中的 call 和 apply使用理解

    关于 js 中的 call 和 apply使用理解 在学习新的东西时候,碰到以前看过而又不理解,或则记忆不深的地方不妨回头看看书里知识点,有助于加深理解.正所谓--温故而知新. 废话不多说,直接上代码 ...

  6. 快速理解js中的call,apply的作用

    今天被人问到js中的call,apply的区别和用途,解释了一番后,想到之前在逼乎上看到一位小伙伴生动形象的解释 本身不难理解,看下MDN就知道了,但是不常用,遇到了,还要脑回路回转下.或者时间长了, ...

  7. JS中的call()和apply()方法(转)

    转自:http://uule.iteye.com/blog/1158829 JS中的call()和apply()方法 博客分类: JS   1.方法定义 call方法: 语法:call([thisOb ...

  8. 理解JS中的call、apply、bind方法(*****************************************************************)

    在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:app ...

  9. js 中arguments,call,apply,bind的使用

    //对于 arguments和this, 每个函数都有自己独有的arguments和this, 且不进行链式查找 //arguments是什么? //答:1:arguments是收到的实参副本 //2 ...

  10. js中的call、apply、bind

    在js中每个函数都包含两个非继承而来的方法:call()和apply() call和apply的作用都是在特定的作用域中将函数绑定到另外一个对象上去运行,即可以用来重新定义函数的执行环境,两者仅在定义 ...

随机推荐

  1. 有赞透明多级缓存解决方案(TMC)设计思路

    引子 TMC 是什么 TMC,即"透明多级缓存(Transparent Multilevel Cache)",是有赞 PaaS 团队给公司内应用提供的整体缓存解决方案. TMC 在 ...

  2. php安装igbinary扩展(windows)

    pecl.php.net 是php的扩展仓库,访问此网站后,搜索需要安装的扩展,截图如下: igbinary: http://pecl.php.net/package/redis github的网址: ...

  3. 带"反悔"的贪心-超市

    题面:https://www.acwing.com/problem/content/description/147/ 超市里有N件商品,每个商品都有利润pi和过期时间di,每天只能卖一件商品,过期商品 ...

  4. Spring源码阅读 之 搭建源码阅读环境(IDEA)

    检出源码: GitHub:https://github.com/spring-projects/spring-framework.git 可以按如下步骤:(须确保Git已正确安装) Git正确安装后, ...

  5. SORM框架01

    架构图 Query接口:负责查询(对外提供的核心服务类) QueryFactory类:负责根据配置信息创建Query对象 TypeConvertor接口:类型转换 TableContext类:负责获取 ...

  6. flink流处理从0到1

    一.DataStream API之Data Sources(消费者之数据源) 介绍: source是程序的数据源输入,你可以通过StreamExecutionEnvironment.addSource ...

  7. python 基础知识4 - 字典

    1.字典增 #字典增 dic = {'name': '大白', 'age': 20} dic['hight'] = 180 #没有键值对,添加 dic['age'] = 18 #有键值对,覆盖 pri ...

  8. 06JAVA面向对象之封装

    一.面向对象 1.面向过程和面向对象 面向过程 分析问题的步骤,然后逐步实现. 面向对象 (1)面向对象基于面向过程 (2)面向对象是找出解决问题的人,然后分配职责. (3)对象中包含解决问题的步骤 ...

  9. javaweb学习之路(2)response

    写一个简单的登录页面 1.创建一个login.jsp文件 主要内容: <form action="check.jsp" method="post"> ...

  10. layui批量传值到后台操作时出现传值为空的问题

    如图,前台的样子,data的参数为 [ {"good_id":1,"good_name":"标样-总磷","good_num&qu ...