【js】this指向问题

1.首先先明确,this会出现在哪里。

this出现在全局作用域中,或函数作用域中(普通函数、箭头函数)。
对象是不产生作用域的,对象的{}和函数的{}不一样,this并不会直接出现在对象或类中,只会出现在对象/类的函数中。

2.this指向哪里

this在全局作用域下指向的是window。
this在函数中指向的比较复杂, 满足以下四点:
1.函数在调用时,JavaScript会默认给this绑定一个值;
2.this的绑定和定义的位置(编写的位置)没有关系;
3.this的绑定和调用方式以及调用的位置有关系;
4.this是在运行时被绑定的;

3.this的绑定规则

以下指的规则都是普通函数中的,不包括箭头函数。

1.默认绑定
如果一个函数调用是直接调用,比如fn()这样,没有对象.fn(),就说它是默认绑定的,通常默认绑定时,函数中的this指向全局对象(window);
且要找到函数真正的调用位置,看它是否是独立函数直接调用。

function foo() {console.log(this); // window
}foo();

2.隐式绑定
通过某个对象进行调用的。比如对象.fn()。通过某个对象发起的函数调用。这时候this会被绑定在该对象身上

function foo() {console.log(this); // obj对象
}var obj = {name: "why",foo: foo
}obj.foo();

上面提到要找到函数真正的调用位置,看它是否是独立函数直接调用。
下面举个例子,这个实际的调用位置其实是直接调用的。

function foo() {console.log(this);
}var obj1 = {name: "obj1",foo: foo
}// 讲obj1的foo赋值给bar
var bar = obj1.foo;
bar();

3.显式绑定
通过apply、call、bind进行绑定就是显式绑定

function foo() {console.log(this);
}foo.call(window); // window
foo.call({name: "why"}); // {name: "why"}
foo.call(123); // Number对象,存放时123

4.new绑定
使用new,这个新对象会绑定到函数调用的this上。
绑定的this是这个类/构造函数的实例对象。

// 创建Person
function Person(name) {console.log(this); // Person {}this.name = name; // Person {name: "why"}
}var p = new Person("why");
console.log(p);

4.特殊的this

1.setTimeout
setTimeout内部如果传的是普通函数,那这个this指向的是window。
这和setTimeout源码的内部调用有关,记住就好了。

setTimeout(function() {console.log(this); // window
}, 1000);

2.forEach
内部传普通函数,this指向的也是window。

var names = ["abc", "cba", "nba"];
names.forEach(function(item) {console.log(this); // 三次window
});

3.dom节点
this指向的是绑定事件的节点。

var box = document.querySelector(".box");
box.onclick = function() {console.log(this); // box对象
}

4.箭头函数
箭头函数没有this,也就是不绑定this,如果在箭头函数中使用this,则是根据外层作用域来决定this。
所以与上面的setTimeout、forEach特点结合,经常在setTimeout、forEach中使用箭头函数。

var obj = {data: [],getData: function() {setTimeout(() => {// 模拟获取到的数据var res = ["abc", "cba", "nba"];this.data.push(...res);}, 1000);}
}obj.getData();

这里,setTimeout中通过箭头函数调用this,这个this与外层作用域相同,也就是和在getData函数中使用this的指向相同。

但如果getData也是个箭头函数,那么getData函数中使用this的指向 与 外层作用域相同,也是与全局作用域中的this一致,window。

var obj = {data: [],getData: () => {setTimeout(() => {console.log(this); // window}, 1000);}
}obj.getData();

5.规则优先级

new绑定 > 显式绑定(bind)> 隐式绑定 > 默认绑定

1.new绑定和call、apply是不允许同时使用的,所以不存在谁的优先级更高
但new绑定优先级高于bind

function foo() {console.log(this);
}var obj = {name: "obj"
}// var foo = new foo.call(obj);
var bar = foo.bind(obj);
var foo = new bar(); // 打印foo, 说明使用的是new绑定

2.new绑定优先级高于隐式绑定

function foo() {console.log(this);
}var obj = {name: "why",foo: foo
}new obj.foo(); // foo对象, 说明new绑定优先级更高

3.显式绑定优先级高于隐式绑定

function foo() {console.log(this);
}var obj1 = {name: "obj1",foo: foo
}var obj2 = {name: "obj2",foo: foo
}// 隐式绑定
obj1.foo(); // obj1
obj2.foo(); // obj2// 隐式绑定和显式绑定同时存在
obj1.foo.call(obj2); // obj2, 说明显式绑定优先级更高

参考:前端面试之彻底搞懂this指向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/40738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android SurfaceFlinger——屏幕状态初始化(二十二)

对于开机启动动画前期准备的相关步骤,我们已经分析了前 5 个,对于第 6 步调用 eglGetDisplay() 函数对 OpenGL ES 初始化并获取默认屏幕,我们在介绍 OpenGL ES 的时候也进行了详细的分析,下一步我们我们来分析对屏幕的状态进行初始化。 1)getInternalDisplayToken:获取显…

pycharm小游戏制作

以下是一个使用 Python 和 PyGame库在 PyCharm中创建一个简单的小游戏(贪吃蛇游戏)的示例代码,希望对您有所帮助: import pygame import random# 基础设置 # 屏幕高度 SCREEN_HEIGHT 480 # 屏幕宽度 SCREEN_WIDTH 600 # 小方格…

Java | Leetcode Java题解之第212题单词搜索II

题目&#xff1a; 题解&#xff1a; class Solution {int[][] dirs {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};public List<String> findWords(char[][] board, String[] words) {Trie trie new Trie();for (String word : words) {trie.insert(word);}Set<String> a…

VitePress美化

参考资料&#xff1a; https://blog.csdn.net/weixin_44803753/article/details/130903396 https://blog.csdn.net/qq_30678861/category_12467776.html 站点信息修改 首页部分的修改基本都在.vitepress/config.mts,这个文件内修改。 title 站点名称 description 描述 top…

运维团队指南:完善监控指标与优化报警机制

随着业务规模的不断扩大和系统复杂度的日益增加&#xff0c;运维团队面临着前所未有的挑战。为了保障系统的稳定性和高效运行&#xff0c;完善监控指标与优化报警机制成为了运维工作中的重中之重。本文将结合运维行业动态&#xff0c;就如何完善监控指标体系、优化报警机制等方…

RedHat运维-Linux SSH基础3-sshd守护进程

1. sshd这个守护进程提供了OpenSSH服务&#xff0c;请问可以通过编辑哪些配置文件&#xff0c;来配置这个服务呢&#xff1f;________________________ 2. sshd这个守护进程提供了OpenSSH服务&#xff0c;请问可以通过编辑哪些配置文件&#xff0c;来配置这个服务呢&#xff1f…

Java springboot校园管理系统源码

Java springboot校园管理系统源码-014 下载地址&#xff1a;https://download.csdn.net/download/xiaohua1992/89364089 技术栈 运行环境&#xff1a;jdk8 tomcat9 mysql5.7 windows10 服务端技术&#xff1a;Spring Boot Mybatis VUE 使用说明 1.使用Navicati或者其它工…

怎么样调整分类的阈值

调整分类模型的阈值是改变模型对正负类的预测标准的一种方法&#xff0c;常用于提高精确率、召回率或者其他性能指标。以下是如何调整分类阈值的步骤和方法&#xff1a; PS&#xff1a;阈值是针对预测概率&#xff08;表示样本属于某个特定类别的可能性&#xff09;来说的 调…

Midjourney 如何使用参考图像来提升图像的准确性和相似度?

🧙🏼图像提示 🧙🏼‍♂️ 您可以使用图像作为提示的一部分来影响作业的构图、样式和颜色。图像提示可以单独使用,也可以与文本提示一起使用 - 尝试组合具有不同样式的图像以获得最令人兴奋的结果。 🛠️实际图像提示操作步骤 点击加号按钮,双击上传文件,把小黄猫…

超级好用的java http请求工具

kong-http 基于okhttp封装的轻量级http客户端 使用方式 Maven <dependency><groupId>io.github.kongweiguang</groupId><artifactId>kong-http</artifactId><version>0.1</version> </dependency>Gradle implementation …

ePTFE膜(膨体聚四氟乙烯膜)应用前景广阔 本土企业技术水平不断提升

ePTFE膜&#xff08;膨体聚四氟乙烯膜&#xff09;应用前景广阔 本土企业技术水平不断提升 ePTFE膜全称为膨体聚四氟乙烯膜&#xff0c;指以膨体聚四氟乙烯&#xff08;ePTFE&#xff09;为原材料制成的薄膜。ePTFE膜具有耐化学腐蚀、防水透气性好、耐候性佳、耐磨、抗撕裂等优…

自然语言处理(NLP)—— 期末复习总

1. 结构主义方法The structural Approach 1.1 语素学Graphemics/音素学phonemics 音素phonemes、书面符号written signs、字符character。这一部分关注语言的最小声音单位&#xff08;音素phonemes&#xff09;以及这些声音如何通过书面符号written signs或字符character来表示…

如何做到高级Kotlin强化实战?(二)

高级Kotlin强化实战&#xff08;二&#xff09; 2.Kotlin 与 Java 比较 2.Kotlin 与 Java 比较 2.5 字符串拼接 //Java String firstName "Android"; String lastName "enginner"; String message "My name is: " firstName " "…

Web美食分享平台的系统-计算机毕业设计源码45429

基于Web美食分享平台的系统设计与实现 摘 要 本研究基于Spring Boot框架&#xff0c;设计并实现了一个Web美食分享平台&#xff0c;旨在为用户提供一个交流分享美食体验的社区平台。该平台涵盖了用户注册登录、美食制作方法分享发布、点赞评论互动等功能模块&#xff0c;致力于…

3D Web轻量化平台HOOPS Web Platform的功能与应用分析

随着3D技术在多个行业的广泛应用&#xff0c;对于3D模型轻量化的需求日益增长。HOOPS Web Platform作为一个先进的3D模型轻量化平台&#xff0c;为开发人员提供了一整套工具来构建和部署基于Web的工程应用程序。本文将分析HOOPS Web Platform的核心功能和它在不同领域的应用情况…

软件工程学面向对象

一、面向对象方法学概述 传统的生命周期方法学在消除软件非结构化、促进软件开发工程化方面起了积极的作用&#xff0c;但仍有许多不足&#xff0c;存在的主要问题有&#xff1a;①生产率提高的幅度不能满足需要&#xff1b; ②软件重用程度很低&#xff1b; ③软件很难维护&a…

MySQL中的MVCC解析

MySQL中的MVCC解析 多版本并发控制是MySQL中实现高并发的一种关键技术。通过对数据进行多版本的管理&#xff0c;MVCC能够在保证数据一致性的同时&#xff0c;提高数据库的并发性能。本文将深入探讨MySQL中的MVCC机制&#xff0c;包括其原理、实现方式以及优势。 MVCC的原理 …

华为机试HJ22汽水瓶

华为机试HJ22汽水瓶 题目&#xff1a; 某商店规定&#xff1a;三个空汽水瓶可以换一瓶汽水&#xff0c;允许向老板借空汽水瓶&#xff08;但是必须要归还&#xff09;。 小张手上有n个空汽水瓶&#xff0c;她想知道自己最多可以喝到多少瓶汽水。 想法&#xff1a; 因为可以…

硬件开发工具Arduino IDE

招聘信息共享社群 关联上篇文章乐鑫ESPRESSIF芯片开发简介 Arduino IDE&#xff08;集成开发环境&#xff09;是为Arduino硬件开发而设计的一款软件&#xff0c;它提供了一个易于使用的图形界面&#xff0c;允许用户编写、编辑、编译和上传代码到Arduino开发板。Arduino IDE的…

深入分析 Android BroadcastReceiver (八)

文章目录 深入分析 Android BroadcastReceiver (八)1. 系统与自定义实现1.1 系统广播机制1.1.1 系统广播的实现原理1.1.2 系统广播的源码分析 1.2 自定义广播机制1.2.1 自定义广播的实现步骤1.2.2 自定义广播的源码分析 2. 广播机制设计的初衷与优势2.1 设计初衷2.2 优势 3. 总…