一、被apply和call调用的函数中没有传递参数

(一)不传参数



结果:

(二)传递 null



结果:

总结:

1.当使用 apply和 call去调用函数并且没有传递参数时,前提这个函数中也没有传递参数,我们发现 他们的打印结果和 this 指向是相同的 都是指向window 此时相当于 f1() 调用函数 就相当于 f1.apply() 和 f1.call()

2.当传递 null 的时候,他们的指向也是相同的 都是指向 window

此时相当于 f1() 调用函数 就相当于 f1.apply(null) 和 f1.call(null)

(三)当传递一个具体对象时

结果:

我们发现 使用 f1.apply(stu) f1.call(stu) 去调用函数的时候,this的指向发生了改变,不再是 window,而是 Object

二、被 apply和 call 调用的函数中有参数传递

(一)apply和call不传递参数



结果:

总结:

apply和call没有传递参数,所以没有进行参数的运算,值是 NaN ,但是他们的this指向并没有改变,仍然是 window

(二)当传递null时



结果:

总结:

与不传参数的结果是一样的,值是 NaN,并且this 指向没有改变

(三)当传入一个具体对象时



结果:

总结:

两个方法传入具体对象时,都改变了 this的指向,this 指向不是 window ,而是 Object

思考:

两者都传入一个对象改变了 this 指向,但是如何去传入参数进行函数的运算呢???

(四)传入多个参数



结果:

总结:

1.apply和call传入的第一个参数表示 this 指向的对象

2.apply和call可以传递多个参数,只是他们传递参数的方式不一样

3.apply是以数组的方式传递参数的

4.call是以参数列表的方式传递参数的,也就是通过一个一个的方式传递参数

(五)改变this指向,获取对象中的属性值

总结:

1.f1()函数调用时,this的指向是window,而window中没有定义age这个属性值,所以是 undefined

2.apply和call都改变了 this 的指向,this 指向了 stu ,stu这个对象中有 age 这个属性值 ,所以输出 age = 18

三、被apply和 call 调用的函数中有返回值

总结:

apply 和 call 都使用变量来接收函数的返回值

四、原型指向改变案例

        function Person(food) {
this.food = food
}
// 通过原型来添加方法
Person.prototype.eat = function (x, y) {
console.log('我好想吃 ---->' + this.food)
console.log(x + y)
}
var per = new Person('大猪蹄')
per.eat(100, 100) //创建 stu 对象,并添加属性和方法
console.log('============================') function Student(food) {
this.food = food
}
Student.prototype.study = function () {
console.log('秃头少女的日常操作,天天敲代码')
} var stu = new Student('大鸡腿')
//改变this指向,让this指向 stu对象
//能调用 per对象中的方法
per.eat.apply(stu, [200, 200])
//也能调用自己的方法
stu.study()

结果:

五、总结apply与call

  • apply 的使用方式

    函数名字.apply (对象,[参数1,参数2,...])

    方法名字.apply (对象,[参数1,参数2,...])

  • call 的使用方式

    函数名字.call (对象,参数1,参数2,...)

    方法名字.call (对象,参数1,参数2,...)

  • 作用:改变this 的指向

  • 区别:参数传递的方式不一样

  • 使用场景:只要是想使用别的对象的方法,并且希望这个方法是当前对象自己的,那么就可以使用 apply 或者 call 的方法 改变 this 的指向

六、bind 方法的使用



结果:

我们发现,虽然使用了bind 方法,但是它并没有输出内容,所以,要用一个变量接收一下,然后再调用



结果:

还可以写成:

七、bind方法的案例

        function Person(say){
this.say = say
}
Person.prototype.play = function(x,y){
console.log('做人嘛~~最重要的就是要开心呐!!' + this.say )
console.log(x+y)
}
var per = new Person('对呢对呢')
per.play(10,10)
//这是一条华丽的分割线
console.log('==============================================')
function Student(say){
this.say = say
}
Student.prototype.study = function(){
console.log('一根毛,两根毛,头上还有几根毛')
} var stu = new Student('撒花撒花')
//调用别人的方法
var ff = per.play.bind(stu)
ff(20,20)
//调用自己的方法
stu.study()

结果:

八、apply与call与bind之间的区别

相同点:

  1. 他们的作用都是相同的:改变 this 的指向
  2. 当他们不传参数的时候,就跟直接调用函数或者方法的作用一样,不改变this的指向
  3. 当只传入 null 的,与上面作用也是一样,不改变this的指向

不同点:

  1. apply 与 call 直接调用即可
  2. bind 要使用变量接收一下,然后再调用
  3. apply与call 是在调用的时候直接传递参数
  4. bind 可以在用变量接收的时候传递参数,也可以在接收后在调用中传递参数
  5. 传递参数的方式不一样
  • apply 的使用方式

    函数名字.apply (对象,[参数1,参数2,...])

    方法名字.apply (对象,[参数1,参数2,...])
  • call 的使用方式

    函数名字.call (对象,参数1,参数2,...)

    方法名字.call (对象,参数1,参数2,...)
  • bind 的使用方式:

    函数名字.bind (对象,参数1,参数2,...)

    函数名字. bind (对象),在调用时再传递参数

    方法名字.bind (对象,参数1,参数2,...)

    方法名字. bind (对象),在调用时再传递参数

apply 、call 以及 bind 的使用和区别的更多相关文章

  1. 让你弄懂 call、apply、bind的应用和区别

    call.apply.bind使用和区别 // 有只猫叫小黑,小黑会吃鱼 const cat = { name: '小黑', eatFish(...args) { console.log('this指 ...

  2. 使用call、apply、bind继承及三者区别

    js里的继承方法有很多,比如:使用原型链的组合继承.es6的Class.寄生继承以及使用call.apply.bind继承.再说继承之前,我们先简单了解下它们的区别. 一.区别: 同:三者都是改变函数 ...

  3. call,apply,bind的用法及区别

    <script> function test(){ console.log(this) } // new test(); //函数调用call方法的时候,就会执行. //call的参数:第 ...

  4. bind,call,applay的区别

    方法调用模式: 当一个函数被保存为对象的一个方法时,如果调用表达式包含一个提取属性的动作,那么它就是被当做一个方法来调用,此时的this被绑定到这个对象. var a = 1 var obj1 = { ...

  5. 动态作用域与this +apply和call +bind

    词法作用域是一套关于引擎如何寻找变量以及会在何处找到变量的规则. (函数作用域和块作用域) JavaScript 中的作用域就是词法作用域,也就是静态作用域,由定义代码决定 动态作用域似乎暗示有很好的 ...

  6. js call apply caller callee bind

    call apply bind作用类似.即调用一个对象的一个方法,以另一个对象替换当前对象. call 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) ...

  7. jQuery中的bind() live() delegate()之间区别分析

    jQuery中的bind() live() delegate()之间区别分析 首先,你得要了解我们的事件冒泡(事件传播)的概念,我先看一张图 1.bind方式 $('a').bind('click', ...

  8. Jquery中bind和live的区别

    Jquery中绑定事件有三种方法:以click事件为例 (1)target.click(function(){}); (2)target.bind("click",function ...

  9. Bind和Eval的区别详解

    原文:Bind和Eval的区别详解 1.简单描述Eval和Bind的区别 绑定表达式 <%# Eval("字段名") %> <%# Bind("字段名& ...

  10. [jQuery]on和bind事件绑定的区别

    on和bind事件绑定的区别 一个demo展示 <!DOCTYPE html> <html lang="zh"> <head> <titl ...

随机推荐

  1. C#3新增语法特性

    C#3,.Net Framework 3.5 ,Visual Studio 2008, CLR 3.0 C#3.0新引进的语法基于.Net Framework 3.5.主要引进的语法:Linq,隐式类 ...

  2. 请介绍下你了解的ThreadLocal,它的底层原理!

    前言 业务开发中经常使用 ThreadLocal 来存储用户信息等线程私有对象... ThreadLocal 内部构造是什么样子的?为什么可以线程私有?常说的内存泄露又是怎么回事? 公众号:liuzh ...

  3. C/C++四种取整函数floor,ceil,trunc,round

    处理浮点数操作常用到取整函数,C/C++提供了四种取整函数 floor函数 floor函数:向下取整函数,或称为向负无穷取整 double floor(double x); floor(-5.5) = ...

  4. 安卓快速关机APP

    目录 自说自话 使用方法 自说自话 像我这样每天晚上睡觉关机的人不知道有多少,反正我每天都有关机的需求.因此我特别讨厌长按关机键进行关机,感觉浪费我好几秒的生命. 因此我开发了这款APP,主要是自用, ...

  5. IAuthorizationFilter学习笔记(权限控制)以及非全局的filter

    第一步:新建类CheckLoginFilter实现接口IAuthorizationFilter.请注意接口位于命名空间using System.Web.Mvc; public void OnAutho ...

  6. Docker 运行 SQL Server 容器映像

    随着.Net Core迭代,大家也都用上了Linux用上了Docker.跟.Net经常配套使用的SQL SERVER以前一直是windows only,但是从SQL Server 2017开始已经支持 ...

  7. 5. Spark调优

    *以下内容由<Spark快速大数据分析>整理所得. 读书笔记的第五部分是讲的是Spark调优相关的知识点. 一.并行度调优 二.序列化格式优化 三.内存管理优化 四.Spark SQL性能 ...

  8. zabbix 告警实践分享 一键实现zabbix 电话、邮件、微信告警

    众所周知Zabbix 是一款用来监控IT基础设施的监控套件,同时也具有很多方便运维人员使用的优秀功能,如:支持多条件告警,支持多种告警方式,支持多组模板.支持模板继承,因此在众多的开源运维监控软件中独 ...

  9. KafkaProducer 发送消息流程

    Kafka 的 Producer 发送消息采用的是异步发送的方式.在消息发送的过程中,涉及到了 两个线程--main 线程和 Sender 线程,以及一个线程共享变量--RecordAccumulat ...

  10. 验证rbd的缓存是否开启

    简单快速的在客户端验证rbd的cache是否开启 首先修改配置文件 在ceph.conf中添加: [client] rbd cache = true rbd cache writethrough un ...