函数对象方法

  • call()、apply()这个两个都是函数对象的方法、需要通过函数对象调用

  • 当对函数调用call()和apply()、都会调用函数执行

    /*
    call()和apply()是函数对象的两个方法
    */
    function fun(){console.log('我是fun函数');
    }
    /* 正常调用 */
    fun() //我是fun函数/* 使用apply和call调用 */
    fun.call() //我是fun函数
    fun.apply() //我是fun函数
    

函数的this指向

  1. 以函数形式调用时、this永远都是window

  2. 以方法的形式调用时、this是调用方法的对象

    function fun(){console.log(this);
    }
    fun() //this=>指向windowlet obj = {}function fun1(){console.log(this); //this=>指向Objct
    }fun1.call(obj)  //this指向obj
    fun1.apply(obj) this指向obj
    
  3. 在调用call()、apply()可以将一个对象指定为第一个参数。此时这个对象将会成为函数执行时的this.

    /* 原本函数的指向永远都是window对象1、使用了call、apply。把里面的this指向改为obj2、所以此时的fun函数的this指向obj
    */
    function fun(name,age){console.log(name); //zjfconsole.log(age);  //18//现在的感觉就像是函数多了一个对象// 其实就是把原来指向window的this// 指向了那个对象console.log(this.name);  //obj_name  this.say()     //obj_name 让我看康
    }
    let obj = {name:'obj_name',say(){console.log(this.name,'让我看康');}
    }
    // 函数对象.call方法(对象||this它指向谁this就指向谁、后面跟参数)
    fun.call(obj,'zjf',11)

构造函数的this指向

  1. 以构造函数的形式调用、this就是新创建的那个对象

    // 构造函数中的this
    function Person(name,age){this.name = namethis.age = age
    }
    /* 在obj对象里面有一个say方法使用的是this.name+‘字符’
    */
    let obj = {name:'obj_name',say:function(){console.log(this.name+'是say()方法');}
    }
    /* 使用new语句实例化一个对象此时p是构造函数实例化出来的一个对象而这个apply(对象),你写一个对象它的this指向就是指向的那个
    */
    let p = new Person('zjf',18)/* 现在的this指向的就是、构造函数中的this.
    */
    obj.say.apply(p)//zjf是say()方法
    obj.say.call(p)//zjf是say()方法
    
// 构造函数中的this
function Person(name,age){this.name = namethis.age = ageobj.say.apply(this)
}
/* 在obj对象里面有一个say方法使用的是this.name+‘字符’
*/
let obj = {name:'obj_name',say:function(){console.log(this.name+'是say()方法');}
}// obj.say()
/* 使用new语句实例化一个对象此时p是构造函数实例化出来的一个对象而这个apply(对象),你写一个对象它的this指向就是指向的那个
*/
let p = new Person('zjf',18)
//zjf是say()方法

总结:

  1. call和apply都是为了改变this的指向问题、在第一个参数里写那个对象、他们的this就指向谁、作用都一样。
  2. call的传参方式是直接写写在后面就可以了、但是apply只接受一个参数数组
  3. bind和其他两个方法作用也是一致的,只是该方法会返回一个函数。

call()、apply()、bind()的区别相关推荐

  1. 创建对象的方式以及call,apply,bind的区别

    创建对象的方式有四种 1.直接量 var obj={ 属性名:属性 方法名:function(){} } 2.通过构造函数创建对象,这样能够批量创建多个具有相同属性的子对象(顺便介绍call,appl ...

  2. 前端学习(1115):call apply bind的区别

  3. call,apply,bind的区别

    1 转载于:https://www.cnblogs.com/YangJonathan/p/11223641.html

  4. JS高级—call(),apply(),bind()

    文章目录 call() 介绍 语法 特点 返回值 使用(主要应用) apply() 介绍 语法 特点 返回值 使用 bind() 介绍 语法 特点 返回值 使用 call(),apply(),bind ...

  5. javascript中apply、call和bind的区别

    在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢. 在说区别之前还是先总结一下三者的相似之处: 1.都是用来改变函数的this对象的指向的. 2.第一个参数都是this要指 ...

  6. call(),apply()和bind()的区别和应用以及扩展

    首先三个方法的作用: 1:都是在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域. 2:都是改变this的指向方向 区别: call()和apply()接受参数的方 ...

  7. call apply bind 的作用和区别

    1.call apply bind 的作用和区别 作用: 都可以改变函数内部的this指向. 区别点: 1.call和apply会调用函数,并且改变函数内部this指向. 2.call和apply传递 ...

  8. call apply 和 bind的区别

    apply 和call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. Ja ...

  9. JavaScript中的call,apply,bind区别及应用(包含手写call/apply/bind)

    目录 一.使用目的 二.三者分别是如何定义的及区别(摘自MDN) 三.在程序中收获 四.三者的具体应用 四.手写bind,apply,call 今天在读程序题的时候,遇到call,apply,bind ...

  10. call,apply,bind,new实现原理

    在实际开发过程中,对于函数封装时,不确定外部是谁调用的,调用函数内部方法时,有可能是window调用这时就会报错,常使用call,apply,bind来绑定this指向. Function.proto ...

最新文章

  1. mysql max和order by_mysql – 为什么MAX()比ORDER BY慢100倍… LIMIT 1?
  2. 「后端小伙伴来学前端了」分析Vue脚手架结构
  3. 最严谨的校验email地址的正则表达式
  4. 数据库原理—常用的DBS产品简介(六)
  5. Objectove-c单例模式
  6. new hashmap 初始大小_你们要的HashMap工作原理!它来了!!!
  7. python的list()列表数据类型的方法详解
  8. mac 安装ps2017和破解教程
  9. 服务器价格指导 7月四路机架产品选购
  10. 信息学奥赛一本通pdf_新手如何参加信息学竞赛NOIP,怎么入门(常见问题解答)?...
  11. 计算机基础之二进制详解(二)
  12. R Fisher精确检验
  13. Python编程:腾讯防水墙原理浅析与Flask结合测试
  14. 零基础快速入门(二)爬取豆瓣电影——python爬虫实例
  15. 圆锥螺旋线matlab 画,圆锥螺旋线 - calculus的日志 - 网易博客
  16. Go命令行调用Python运行ParlAI模型,同步输入输出并调用百度翻译API翻译
  17. windows安装hadoop教程,带截图
  18. Python爬虫:和我一起学习scrapy(三)
  19. 测试 必问面经华子~
  20. 【半导体先进工艺制程技术系列】SOI技术(中)

热门文章

  1. 完全用Linux工作——来自人人网分享
  2. 新手摸爬滚打:vue+springboot前后端分离项目演示(三)——axios实现前后端交互
  3. 让IE浏览器支持HTML5标准的方法(转)
  4. 奥比中光深度相机ros2 humble版安装分享
  5. 美国计算机硕士学校,美国计算机硕士不同学校申请难度大盘点(下篇)
  6. 怎样复制粘贴windows命令行中的内容 .
  7. 莫比乌斯反演-小总结
  8. 第二章--图形图像处理技术——基础理论和基本工具的使用
  9. Python 修改文件名加前缀
  10. 数据圈最全的数据产品文章全集