IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 【JS基础】你说这个this到底指向谁? -> 正文阅读

[JavaScript知识库]【JS基础】你说这个this到底指向谁?

前言

很多JS初学者第一次接触this的时候,很容易被他的指向搞晕。我当时也不例外,现在回过头来记录一下this指向的有关案例。


ES5

在es5中,我们可以简单的理解this的指向规律为:谁执行或者是谁的就指向谁

在全局作用域中

function fn() {
	console.log(this)
}
fn() // 执行打印window,因为我们的函数是定义在全局作用域中,也就是把变量定义在window上,作为属性,所以函数调用其实就是window在调用这个函数,this指向这个函数。

在对象上

let obj = {
	showThis(){
		console.log(this)
	}
}
obj.showThis() // 打印obj,一样原理,因为函数是obj上身的,也是obj执行的,所以就指向obj

好,很自信是不是,给你来个坑

let obj = {
	showThis(){
		setTimeOut(function(){console.log(this)},0)
	}
}
obj.showThis() // 先猜下

// 打印的是window,因为setTimeOut筛入的函数的执行是setTimeOut执行的,学过setTimeOut的都知道,setTimeOut是window上的函数,所以打印出来的是window。

那想打印正确的this指向怎么办呢?可以借助es6的箭头函数。


ES6箭头函数

es6的箭头函数this指向当前环境,且是固定的。

引用我之前写箭头函数的文章的话就是:

具体就是指向箭头函数所在代码位置的环境。在箭头函数外面打console.log(this)就知道指向谁了,而且是定死的无法被二次修改,解决了es5中this指向混乱的问题,防止开发过程代码量大起来,因为this的指向问题出现错误。

let obj = {
	showThis(){
		setTimeOut(()=>{console.log(this)},0)
	}
}
obj.showThis() // 因为箭头函数的this指向环境,此时这个环境就是showThis内,showThis又是obj的,所以this指向obj。

其实对环境这个词觉得抽象的话,可以理解为指向上个作用域即可。


class类中

class Person {
	constructor(name) {
		this.name = name
	}
	showThis(){
		console.log(this)
	}
}
const man = new Person('小夏')
man.showThis() // this指向当前对象 man

改变this指向

主要是三剑客:call、apply、bind

function fn() {
	console.log(this)
}

fn.call({a: 1}) // 打印this为{a: 1}

可以看到call就是改变指向的同时执行函数。call的第二个参数是fn的入参,例如fn.call(null, 1, 2)

const fn1 = fn.bind({a: 1}) 
fn1() // 打印this为{a: 1}

可以看出,bind改变this指向,并返回改变指向后的函数,还需要自己亲自执行。bind的第二个参数是fn的入参,例如bind.call(null, 1, 2)()

apply的用法和call一样,只不过第二个参数传的是数组,例如:fn.apply(null, [1, 2])

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-16 12:59:54  更:2022-02-16 13:02:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:38:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码