小帅の技术博客 小帅の技术博客
首页
  • 基础
  • 框架
  • 进阶
  • 工程化
  • NodeJS
  • 脚本
  • 拓展
  • 技术
  • 服务器
程序猿
关于
友链
  • 分类
  • 标签
  • 归档
GitHub

前端小帅

学而不思则罔,思而不学则殆
首页
  • 基础
  • 框架
  • 进阶
  • 工程化
  • NodeJS
  • 脚本
  • 拓展
  • 技术
  • 服务器
程序猿
关于
友链
  • 分类
  • 标签
  • 归档
GitHub
  • JavaScript

  • 面试

    • 内容梳理
    • 图片优化
    • 服务&网络
    • 浏览器
    • CSS盒模型、BFC、Grid布局
    • 原型、原型链、原型继承和类继承特点
    • this剖析apply、call、bind
      • 改变 this 的指向
      • 箭头函数
      • apply、call、bind 区别
      • 创建构造函数 new 的过程
    • JS模块化
    • CSS布局
    • 网络

this剖析apply、call、bind

this、apply、call、bind

提示

简单理解:this 永远指向最后调用它的那个对象。(匿名函数的 this 永远指向 window)

# 改变 this 的指向

  1. 箭头函数
  2. 函数内部使用 let _this=this 保存 this
  3. 使用 apply、call、bind

# 箭头函数

  1. 箭头函数的 this 始终指向函数定义时的 this,而非执行时。
  2. 箭头函数不能用作构造函数,因为它没有自己的this,无法实例化。
  3. 也是因为箭头函数没有自己的this,所以箭头函数 内也不存在arguments对象。(可以用扩展运算符代替)
  4. 没有 prototype

# apply、call、bind 区别

  1. apply

    • 概述:apply() 方法会立即调用执行该函数

    • 语法:fun.apply(thisArg, [argsArray]) ,参数为组数(或类数组)形式

    • 示例:

      let obj={
        name:'bar',
        fn:function(a,b){
          console.log(a+b)
        }
      }
      let fun=obj.fn
      fun.apply(obj,[1,2]) //3
      
      1
      2
      3
      4
      5
      6
      7
      8
  2. call

    • 概述:call() 方法会立即调用执行该函数

    • 语法:fun.call(thisArg[, arg1[, arg2[, ...]]]) ,参数为给定的参数序列

    • 示例:

      let obj={
        name:'bar',
        fn:function(a,b){
          console.log(a+b)
        }
      }
      let fun=obj.fn
      fun.call(obj,1,2) //3
      
      1
      2
      3
      4
      5
      6
      7
      8
  3. bind

    • 概述:bind() 是将函数返回,因此后面还需要加()才能调用。

    • 语法:同 call() 方法

    • 示例:

      let obj={
        name:'bar',
        fn:function(a,b){
          console.log(a+b)
        }
      }
      let fun=obj.fn
      fun.bind(obj,1,2) // 没有输出
      fun.bind(obj,1,2)() // 3 手动调用执行
      
      1
      2
      3
      4
      5
      6
      7
      8
      9

# 创建构造函数 new 的过程

  • 伪代码表示:
var a = new myFunction("Li","Cherry");

new myFunction{
    var obj = {};
    obj.__proto__ = myFunction.prototype;
    var result = myFunction.call(obj,"Li","Cherry");
    return typeof result === 'object'? result : obj;
}
1
2
3
4
5
6
7
8
  • 过程分析:
  1. 创建一个空对象 obj;
  2. 将新创建的空对象的隐式原型指向其构造函数的显示原型。
  3. 使用 call 改变 this 的指向
  4. 如果无返回值或者返回一个非对象值,则将 obj 返回作为新对象;如果返回值是一个新对象的话那么直接直接返回该对象。
编辑
上次更新: 2024/04/15, 14:35:14
原型、原型链、原型继承和类继承特点
JS模块化

← 原型、原型链、原型继承和类继承特点 JS模块化→

最近更新
01
说说call、apply、bind是如何改变this的
03-29
02
从输入 URL 到页面加载完成发生了什么?
03-29
03
JavaScript进阶—— new 的执行过程
03-26
更多文章>
sunss | © 2020.08-2024.04 浙ICP备2022002957号-1
载入天数... 载入时分秒...  |  总访问量 次
提供CDN加速/云存储服务
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式