bind、call、apply都是用来改变函数内部this指向的方法,使用上仅有细微差别

一、代码

   function person(p1, p2, p3) {
console.log('this: ', this)
console.log('name: ', this.name)
console.log('传递的参数p1: ', p1)
console.log('传递的参数p2: ', p2)
console.log('传递的参数p3: ', p3)
} let obj1 = {
name: 'zhangsan',
age: 17
}

let obj2 = {
name: 'sunwu',
age: 18
} let obj3 = {
name: 'aguang',
age: 19
}

二、bind 应用场景(一切不需要立即执行的情况,如,点击事件触发某个函数执行,需要改变函数内this指向的),只是绑定不立即执行

 1     person.bind(obj1, 33) // bind(this要绑定的对象, 其它参数)
2
3 // bind 如果是绑定后立即执行则,bind立即执行需()
4 person.bind(obj1, 44)()
5 /*
6 运行结果:
7 this: {name: "zhangsan", age: 17}
8 name: zhangsan
9 传递的参数p1: 44
10 传递的参数p2: undefined
11 传递的参数p3: undefined
12 */
13
14    // bind 使用场景举例:一个按钮单击事件,点击后触发
15 const btn = document.getElementById('btn1');
16 btn.addEventListener('click', person.bind(obj1, 55, 66, 77))
17 /*
18 运行结果:
19 this: {name: "zhangsan", age: 17}
20 name: zhangsan
21 传递的参数p1: 55
22 传递的参数p2: 66
23 传递的参数p3: 77
24 */

三、call

 1    // call 改变函数内部this指针到obj2对象,且传递参数88,99,多个参数可以并列用逗号排开 88,99 ... ,是立即执行
2 person.call(obj2, 88, 99)
3 /*
4 运行结果:
5 this: {name: "sunwu", age: 18}
6 name: sunwu
7 传递的参数p1: 88
8 传递的参数p2: 99
9 传递的参数p3: undefined
10 */

四、apply

 1   // bind 改变函数内部this指针到obj3对象,且传递参数[100,200,300],与call区别仅在于apply传递参数是一个数组,多个参数可存在一个数组传递,是立即执行
2 person.apply(obj3, [100, 200, 300])
3 /*
4 运行结果:
5 this: {name: "aguang", age: 19}
6 name: aguang
7 传递的参数p1: 100
8 传递的参数p2: 200
9 传递的参数p3: 300
10 */

bind、call、apply区别的更多相关文章

  1. JavaScript函数 bind call apply区别

    1. apply calll 在JavaScript中 call 和 apply 都是为了改变某个函数运行时上下文而存在的, 换句话说就是为了改变函数内部的this的指向. 这里我们有一个新的对象 b ...

  2. bind,call,apply区别

     js中bind.call.apply函数的用法 2015-02-27 21:16:39 标签:javascript js bind call apply 原创作品,允许转载,转载时请务必以超链接形式 ...

  3. 数组去重,call、apply、bind之间的区别,this用法总结

    一.数组去重,直接写到Array原型链上. //该方法只能去除相同的数字 不会去判断24和'24'是不同的 所有数字和字符串数字是相同是重复的 Array.prototype.redup=functi ...

  4. Bind、Apply、Call三者的区别

    1)bind与apply.call 的最大区别就是:bind不会立即调用,其他两个会立即调用 var fn = { _int: function(){return 3}, fun: function( ...

  5. this指向和apply,call,bind三者的区别

    一.前言 this指向,apply,call,bind的区别是一个经典的面试问题,同时在项目中会经常使用到的原生的js方法.同时也是ES5中的众多坑的一个.ES6中可能会极大的避免了this产生的错误 ...

  6. apply、call、bind有什么区别?

    使用 apply var a = { name : "Cherry", func1: function () { console.log(this.name) }, func2: ...

  7. JavaScript中的call、apply、bind方法的区别

    在JavaScript 中,this的指向是动态变化的,很可能在写程序的过程中,无意中破坏掉this的指向,所以我们需要一种可以把this的含义固定的技术,于是就有了call,apply 和bind这 ...

  8. bind call apply 的区别和使用

    bind call apply 的区别和使用:https://www.jianshu.com/p/015f9f15d6b3 在讲这个之前要理解一些概念,这些概念很重要,有人说过学会了javascrip ...

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

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

  10. bind、apply与call

    bind.apply与call 先说观点:不论是bind.apply还是call,最大的好处就是代码复用. bind 在开发中,我们只有复用代码时,才会出现this指向需要改动的情况. 纵观bind的 ...

随机推荐

  1. 36.Vim笔记

    1.简介 $vim [filename] vim有三种操作模式,分别称为编辑模式.插入模式和命令模式 2.编辑模式 vim编辑模式的主要用途是在被编辑的文件中移动光标的位置.一旦光标移动到所要的位置, ...

  2. linux 中sed命令如何删除第一列和最后一列

    删除第一列 (base) root@PC1:/home/test# cat test.txt1 MIR1302-10 12 FAM138A 23 OR4F5 34 RP11-34P13.7 45 RP ...

  3. windows shell

    屏蔽wifi名称:netsh wlan add filter permission=block ssid="wifi的名称" networktype=infrastructure ...

  4. Expected space(s) after "default" keyword-spacing

    添加空格

  5. 暑假学习五 8.28日 hdfs

    文件系统 文件系统:存储和组织数据的方式,实现了数据的存储,分级组织,访问和获取,使用树状结构 数据:数据本身.文件系统元数据:文件大小,最后修改时间....描述性的数据 分布式文件系统 核心属性: ...

  6. stm32f030 模拟IIC

    #define read_SDA (GPIOA->IDR&GPIO_Pin_10) >>10 //PA10 SDA#define set_SDA GPIO_SetBits(G ...

  7. python菜鸟学习: 8. 集合基础知识

    # -*- coding: utf-8 -*-# 列表的特性:1,去重:2.关系测试list1 = [1, 4, 6, 8, 7, 8, 9]# 集合去重list2 = set(list1)print ...

  8. 20211306 实验一《Python程序设计》实验报告

    202111306 丁文博 第一次实验报告 课程:<Python程序设计> 班级: 2113 姓名: 丁文博 学号:20211306 实验教师:王志强 实验日期:2022年3月24日 必修 ...

  9. Go的目录及其含义

    运行 go env 找到go的运行目录,可以看到下边有三个文件: bin存放编译后的可执行文件(go install 自动创建),pkg存放编译后的包文件(go install 自动创建),src存放 ...

  10. sql 错误问题

    message: ### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: SELECT command denie ...