当前位置: 首页 > article >正文

JavaScript中的this指向问题

JavaScript中的this指向问题

1.1 为什么需要this?

为什么需要this?

在常见的编程语言中,几乎都有this这个关键字(Objective-C中使用的是self),但是在JavaScript中的this和常见的面向对象语言中的this不太一样

  • 常见面向对象的编程语言中,比如Java,C++,Swift、Dart等等一系列语言中,this通常只会出现在方法
  • 也就是你需要有一个类,类中的方法(特别是实例方法)中,this代表的是当前调用对象

但是JavaScript中的this更加灵活无论是它出现的位置还是它代表的含义

我们来看一下编写一个obj的对象,有this和没有this的区别

image-20241122185112728

从上面我们可以看出:this的作用就是提高的代码的复用性,不用随着对象名字的改变而改变,直接this指向当前对象即可

1.2 目前掌握两个this的判断方法

1.2.1 以默认的方式调用一个函数,this指向window

  1. 代码示例:
  function foo(name,age) {
        console.log(arguments)
        console.log(this)
      }
  
  foo("123","hahah","xiix")//默认调用,没有对象引用
  
  function sayHello(name) {
    console.log(this)
  }
  1. 结果分析

image-20241122185717441

  1. 思考题:下述代码fn调用的this指向什么?
    var obj = {
      name:"why",
      running:function() {
        console.log(this)
        console.log(this===obj)
      },
      eating:function() {
        console.log("eaintg~",this.name)
      },
      eaing:function() {
        console.log("studying~",this.name)
      }
    }
    //题目一
    obj.running()
    var fn = obj.running
    fn()

答案:默认调用,指向window对象

image-20241122190132320

    function bar() {
          console.log(this)
    }
      var obj = {
        name:"why",
        "bar":bar
      }
      obj.bar()//谁调用它,对象就会指向哪个

答案:指向obj对象,被obj对象调用

image-20241122190309008

1.2.2 通过对象调用,this指向调用的对象

  1. 代码案例
 var obj = {
      name:"why",
      running:function() {
        console.log(this)//指向的就是obj
        console.log(this===obj)
      },
      eating:function() {
        console.log(this)
      },
      eaing:function() {
        console.log(this)
      }
    }

    obj.running()

结果分析:被obj对象调用,所以指向obj这个对象

image-20241122190447415

  1. 思考题:下述代码调用的this指向什么?
    function bar() {
          console.log(this)
    }
      var obj = {
        name:"why",
        "bar":bar
      }
      obj.bar()//谁调用它,对象就会指向哪个

答案:指向obj对象,被obj对象调用

image-20241122190309008


http://www.kler.cn/a/406400.html

相关文章:

  • Web3.0安全开发实践:Clarity最佳实践总结
  • Stm32f103X HAL库 串口DMA空闲中断学习 踩坑记
  • Linux|进程程序替换
  • 时间操作[计算时间差]免费API接口教程
  • JavaWeb之综合案例
  • 微知-plantuml常用语法和要点以及模板?(note over、create、box,endbox、alt,else,end, autonumber)
  • 容器安全检测和渗透测试工具
  • 成都栩熙酷,电商服务新选择
  • 【SQL Server】华中农业大学空间数据库实验报告 实验七 数据查询
  • 【大语言模型】ACL2024论文-13 透过分裂投票的镜头:探索法律案例结果分类中的分歧、难度和校准
  • “AI玩手机”原理揭秘:大模型驱动的移动端GUI智能体
  • 【Redis 探秘】Redis 持久化机制:RDB 与 AOF
  • 特征融合篇 | CARAFE:轻量级通用上采样算子,可提高目标检测性能
  • 设计模式在项目中有用过吗?怎么用的?
  • 数据结构 (3)线性表的概念及其抽象数据类型定义
  • go项目中比较好的实践方案
  • 【qt版本概述】
  • js前端加密方案库Crypto-js之aes的使用
  • 速通前端篇 —— CSS
  • c++中操作数据库的常用函数
  • 前端vue调试样式方法
  • 前端 px、rpx、em、rem、vh、vw计量单位的区别
  • 【D3.js in Action 3 精译_040】4.4 D3 弧形图的绘制方法
  • 准备阶段 Statistics界面性能分析
  • uniapp H5上传图片前压缩
  • vue的class绑定,后边的类会覆盖前边类样式吗