关于javascript中this的指向问题

this

关于this,近期在做一个在线办公系统的项目,在项目中多次用到了this,所以翻出了之前学习javascript的时候记录的一篇笔记,对this相关的问题作出了说明,希望可以对小白玩家产生帮助

this是一个指本元素,指的是触发当前事件的对象,是函数中用来表示调用这个函数的对象,事件中,由哪个对象触发了事件,那么this就会指向谁

在理解this之前,一定要注意,this既不是指向函数本身,也不是指向函数的词法作用域,也就是this在页面定义的时候,谁也不知道this指向谁,this自己也不知道自己指向谁,只有在函数被调用或者事件被触发的那一瞬间,才可以确定this的指向,也就是this的指向取决于你的怎么调用函数或者触发事件的

要理解this,记住下面的两个点:

this永远指向一个对象

this的指向完全取决于函数调用的位置

不管在什么地方使用this,必然会指向一个对象,确定这一个点,this的使用地方有哪些?

在js语言中,一切皆对象,运行环境也是一个对象,所以函数都是在某个对象下面运行,那么,this就是函数运行时候所在的对象(环境),因为js支持动态的环境切换,也就是说,this的指向是动态的,这一点才是最疑惑的

因此要知道this的指向,首先要搞明白this所处的动态环境

普通函数中:this指向window,因为普通函数都是由window来进行调用的
构造函数中:this指向实例化对象,因为构造函数的方法和属性都是由实例化对象来进行调用
计时器中:this指向window,因为计时器是由window来直接调用
事件对象中:this指向事件对象,因为是由事件对象来进行调用
箭头函数中:this的指向由父级决定,因为箭头函数没有this

案例: 点击哪个li 哪个li变色

javascript 复制代码
<ul>
  <li>111</li>
  <li>222</li>
  <li>333</li>
  <li>444</li>
  </ul>

  <body>
  <script>

  var li = document.querySelectorAll('li')


for (var i = 0; i < li.length; i++) {
  li[i].index = i   //自定义下标
  li[i].onclick = function () {
    this.style.background = 'blue'
    console.log(this.index);

  }
}
</script>
  </body>

自定义下标

javascript 复制代码
var li = document.getElementsByTagName('li');
var div = document.querySelectorAll('.content div');

for (var i = 0; i < li.length; i++) {
  li[i].index = i   //自定义下标  让index接收下标值
  li[i].onclick = function () {
    console.log(this.index);
    for (var i = 0; i < li.length; i++) {
      div[i].style.display = 'none'
      li[i].className = ''
    }
    div[this.index].style.display = 'block'
    li[this.index].className = 'active'
  }
}

改变this的指向

JavaScript基础--改变this指向的方法_js 改变this指向_JJ_Smilewang的博客-CSDN博客

实际的开发场景中,需要改变this默认的指向,这时候就可以使用call(),apply()和bind()来改变this的指向

call()方法

call()方法的第一个参数必须是指定的对象, 方法的原参数挨个放在后面

  1. 第一个参数:传入该函数this执行的对象,传入什么强制指向什么
  2. 第二个参数开始:将原函数的参数挨个填入

格式: 函数名.call()

javascript 复制代码
// function fun() {
        //     console.log(this);//原来的函数this指向的是window
        // }
        // fun()

        function fun(a, b) {
            console.log(this); //改变前 普通函数指向window
            console.log(a + b);
        }
        fun.call('call', 2, 3) //改变后this指向字符串call

apply()方法

apply()方法的第一个参数是指定的对象, 方法的原参数统一放在一个数组中作为第二个参数

  1. 第一个参数:传入该函数this执行的对象,传入什么强制指向什么
  2. 第二个参数开始:将原函数的参数放在一个数组中

格式: 函数名.apply()

javascript 复制代码
function fun(a, b) {
  console.log(this); //改变前 普通函数指向window
  console.log(a + b);
}

fun.apply('call', [2, 3])//改变后this指向字符串call

bind()方法

bind()方法的用法和call()一样,直接运行方法,需要注意的是:bind返回新的方法,需要重新调用

格式:函数名.bind()

javascript 复制代码
function fun() {
    console.log(this);  // 原来的函数this指向的是 Window
}
fun();
 
function fun(a, b) {
    console.log(this); // this指向了输入的 字符串bind
    console.log(a + b);
}
//使用bind() 方法改变this指向,此时第一个参数是 字符串bind,那么就会指向字符串bind
let c = fun.bind('bind', 2, 3);
c(); // 返回新的方法,需要重新调用
// 也可以使用下面两种方法进行调用
fun.bind('bind', 2, 3)();
fun.bind('bind')(2, 3);
相关推荐
清山博客17 分钟前
OpenCV 人脸识别和比对工具
前端·webpack·node.js
要加油哦~19 分钟前
AI | 实践教程 - ScreenCoder | 多agents前端代码生成
前端·javascript·人工智能
程序员Sunday22 分钟前
说点不一样的。GPT-5.3 与 Claude Opus 4.6 同时炸场,前端变天了?
前端·gpt·状态模式
yq19820430115628 分钟前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端
一个public的class29 分钟前
你在浏览器输入一个网址,到底发生了什么?
java·开发语言·javascript
aPurpleBerry32 分钟前
monorepo (Monolithic Repository) pnpm rush
前端
青茶36038 分钟前
php怎么实现订单接口状态轮询请求
前端·javascript·php
火车叼位1 小时前
脚本伪装:让 Python 与 Node.js 像原生 Shell 命令一样运行
运维·javascript·python
VT.馒头1 小时前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展
鹏北海1 小时前
micro-app 微前端项目部署指南
前端·nginx·微服务