this是什么?为什么要改变this?怎么改变 this 指向?

目录

this 是什么?

箭头函数中的 this

为什么要改变 this 指向?

改变 this 指向的三种方法

call(无数个参数)

apply(两个参数)

bind(无数个参数)


this 是什么?

  1. 在对象方法中,this 指的是所有者对象(方法的拥有者)。
    var person = {
        firstName: "Jasmine",
        lastName: "Ge",
        id: 10108888,
        fullName: function(){
            return this.firstName + " " + this.lastName;
        }
    };
    console.log(person.fullName())  // Jasmine Ge
  2. 单独的情况下,this 指的是全局对象。
    // 在浏览器窗口中
    this
    // Window {window: Window, self: Window, document: document, name: '', location: Location, …}
  3. 在函数中,this 指的是全局对象。
    (function myFunction(){
        return this;
    })()
    // Window {window: Window, self: Window, document: document, name: '', location: Location, …}
  4. 在函数中,严格模式下,this 指的是 undefined。
    // js 严格模式不允许默认绑定,因此,在函数中使用时,在严格模式下,this 是未定义的undefined
    "use strict";
    (function myFunction(){
        return this;
    })()
    //undefined
  5. 在事件中,this 指的是接收事件的元素。
    <button onclick = "this.style.backgroundColor='skyblue'; console.log(this)">
        点击来帮我改变颜色!
    </button>

箭头函数中的 this

箭头函数中的 this 等同于上一层非箭头的函数的 this 值或全局对象(window 或 undefined)

解释: 在箭头函数中,this 的指向是由外层(函数或者全局)作用域来决定,如果往外层作用域查找 this 的指向,只要没有非箭头函数(普通函数)的包裹,就一直往外层查找,直到最外层的全局作用域。如果没有非箭头函数(普通函数)的包裹,即使包裹再多层对象 this 也是指向全局作用域的。

let name = 'obj'
let obj1 = {
  name: 'obj1',
  obj2: {
    name: 'obj2',
    obj3: {
      name: 'obj3',
      obj4: {
        name: 'obj4',
        fn: () => {
          console.log(this) // node环境中输出 {},浏览器中输出 window
        }
      }
    }
  }
}
 
obj1.obj2.obj3.obj4.fn()
// Window {0: Window, 1: Window, window: Window, self: Window, document: document, name: 'obj', location: Location, …}

为什么要改变 this 指向?

项目中有如下类似例子,find 函数中的 this 指向调用它的 obj 对象;而在定时器 setTimeout 中调用 find(),this 是指向 window 对象的。但我们需要 find 函数中 的 this 指向 obj 对象,因此我们需要修改 this 的指向。

var position = "这是 windows 的 position";
let obj = {
     position: "这是 obj 的 position",
     find: function() {
        console.log(this.position)
     }
};
obj.find(); // 这是 obj 的 position,this指向obj对象
setTimeout(obj.find, 0); // 这是 windows 的 position,由于 setTimeout() 是异步操作,this 指向 window 对象

改变 this 指向的三种方法

共同点:第一个参数都为改变 this 的指针。若第一参数为 null / undefined,this 默认指向 window

call(无数个参数)
  • 没有参数的时候,指向window
  • 有一个参数的时候,指向当前参数
  • 有多个参数,this指向第一个参数,剩下的参数是参数列表
function fn(a, b, c){
    console.log(this, a + b + c); // this指向window
}
fn();
// Window {0: Window, 1: Window, 2: Window, 3: Window, window: Window, self: Window, document: document, name: '', location: Location, …} NaN
fn.call(document, 1, 2, 3); // call 之后 this 指向 document  
//输出 #document 6   1,2,3是实参 结果相加为6
apply(两个参数)
  • 没有参数的时候,指向window
  • 有一个参数的时候,指向当前参数
  • 有多个参数,this指向第一个参数,剩下的参数是数组
function fn(a, b, c){
    console.log(this, a+b+c); 
}
fn();
// Window {0: Window, 1: Window, 2: Window, 3: Window, window: Window, self: Window, document: document, name: '', location: Location, …} NaN
fn.apply(document, [1, 2, 3]); // apply之后 this 指向 document  
// #document 6
bind(无数个参数)
  • 没有参数的时候,指向 window
  • 有一个参数的时候,指向当前参数
  • 返回值为一个新的函数
  • 使用的时候需要手动调用下返回 的新函数(不会自动执行)
function fn(a, b, c){
    console.log(this, a+b+c);
}
fn()
// Window {0: Window, 1: Window, 2: Window, 3: Window, window: Window, self: Window, document: document, name: '', location: Location, …} NaN
let ff = fn.bind('小明', 1, 2, 3); 
// 手动调用一下
ff()
// String {'小明'} 6

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Navigator)

路由容器组件&#xff0c;提供路由跳转能力。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含子组件。 接口 Navigator(value?: {target: string, type?: NavigationType}) …

网络安全之URL过滤

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; URL过滤是一种针对用户的URL请求进行上网控制的技术&#xff0c;通过允许或禁止用户访问某些网页资源&#xff0c;达到规范上网行为和降低安全风险…

前端项目(vue3)自动化部署(Gitlab CI/CD)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

VUE 运行NPM 报错:npm ERR! code CERT_HAS_EXPIRED 解决方案

现象 由于各种原因需要调试一下VUE代码&#xff0c;用Git拉下来运行不了&#xff08;之前是可以正常运行的&#xff09;&#xff0c;报错为&#xff1a;npm ERR! code CERT_HAS_EXPIRED........... 原因 NPM 证书签名过期了 解决方法 第一步&#xff1a;CMD 命令 查看NPM代理源…

计算机设计大赛 题目:基于卷积神经网络的手写字符识别 - 深度学习

文章目录 0 前言1 简介2 LeNet-5 模型的介绍2.1 结构解析2.2 C1层2.3 S2层S2层和C3层连接 2.4 F6与C5层 3 写数字识别算法模型的构建3.1 输入层设计3.2 激活函数的选取3.3 卷积层设计3.4 降采样层3.5 输出层设计 4 网络模型的总体结构5 部分实现代码6 在线手写识别7 最后 0 前言…

文件操作与IO流

文章目录 File文件操作类IO流原理及流的分类节点流FileInputStreamFileOutputStreamFileReaderFileWriter 处理流BufferedReaderBufferedWriterBufferedInputStreamBufferedOutputStreamObjectInputStreamObjectOutputStreamPrintStreamPrintWriter 标准输入输出流 Properties …

Sublime Text简介、下载、安装、汉化、常用插件和激活——《跟老吕学Python编程》附录资料

Sublime Text简介、下载、安装、汉化、常用插件和激活——《跟老吕学Python编程》附录资料 Sublime Text 简介Sublime Text 下载、安装、汉化、常用插件和激活Sublime Text 官网Sublime Text 下载Sublime Text 安装1.安装2.右键菜单3.启动安装4.耐心等待5.安装完成 Sublime Tex…

实验一:关联规则 (见U盘)

实验名称 关联规则 实验时间 3月 14 日星期 四 第3.4节 实验目的 利用 Python 对关联规则算法进行调用。能够使用 Python 调用关联规则算法。首先使用apriori ,fpgrowth 或者 fpmax 函数来找出频繁项集&#xff0c;然后使用 association_rules …

vivado Placement、时钟和I/O放置、全局布局、详细布局和布局后优化

安置 Vivado Design Suite放置程序将网表中的单元放置到目标AMD中的特定站点上装置与其他实现命令一样&#xff0c;Vivado放置程序工作于并更新&#xff0c;内存中的设计。 设计布局优化 Vivado砂矿器同时优化了以下方面的设计布局&#xff1a; •定时松弛&#xff1a;选择…

不囤货不进货的“抖音小店”,到底靠啥盈利?内行人道出背后原因

大家好&#xff0c;我是电商花花。 在互联网的快速发展下&#xff0c;网购给人们带来了很大的便利&#xff0c;而网络下的电商也是发展迅速&#xff0c;带动了很多人想要创业做电商&#xff0c;找副业的想法。 随着抖音直播电商的快速崛起&#xff0c;抖音小店和无货源运营的…

如何把Spring的Bean注入到Quartz中

前言 今天写Quartz定时调度的时候遇到了想调用增删改查操作数据库的情况 这时候在Quartz容器中 直接注入bean 但是会出现bean为空的情况&#xff0c; 一、为什么为空 这种情况是因为Quartz容器 中 它读取不到Spring 容器中的bean&#xff0c;所以我们需要加一些方法让他读到 …

2024年【危险化学品经营单位安全管理人员】考试及危险化学品经营单位安全管理人员考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试根据新危险化学品经营单位安全管理人员考试大纲要求&#xff0c;安全生产模拟考试一点通将危险化学品经营单位安全管理人员模拟考试试题进行汇编&#xff0c;组成一套危险化学品经…

[JavaWeb学习日记]Vue工程,springboot工程整合Mybatis,数据库索引

目录 一.Vue工程 安装NodeJS与Vue-cli Vue项目创建 启动Vue项目&#xff1a;点击npm脚本serve 改端口&#xff1a;在vue.config.js下 Vue文件组成&#xff1a;templatescriptstyle 使用element 前端服务器当前使用Ngix 主要编写的文件 二.SpringBoot的Web工程 启动带…

Spring boot java: 无效的目标发行版: 18

idea 搭建spring boot 报错java: 无效的目标发行版: 18 本人jdk 1.8 解决方案如下&#xff1a;

Filter实现请求日志记录

将锁有得外部访问都记录在日志文件里面&#xff0c;设计这个功能是为了&#xff08;为什么&#xff09;&#xff1a; 1. 在不引入Promentheus进行接口监控时&#xff0c;基于日志文件就可以实现整个项目得监控。 2. 当出现问题时&#xff0c;可以基于此进行流量重放。 效果如…

HNU-计算机系统-实验1-原型机vspm1.0-(二周目玩家视角)

前言 二周目玩家&#xff0c;浅试一下这次的原型机实验。总体感觉跟上一年的很相似&#xff0c;但还是有所不同。 可以比较明显地感觉到&#xff0c;这个界面越来越好看了&#xff0c;可操作与可探索的功能也越来越多了。 我们HNU的SYSTEM真的越来越好了&#xff01;&#x…

图像处理与视觉感知---期末复习重点(3)

文章目录 一、空间域和频率域二、傅里叶变换三、频率域图像增强 一、空间域和频率域 1. 空间域&#xff1a;即所说的像素域&#xff0c;在空间域的处理就是在像素级的处理&#xff0c;如在像素级的图像叠加。通过傅立叶变换后&#xff0c;得到的是图像的频谱&#xff0c;表示图…

ElasticSearch 看这一篇就够了,详解!!!

目录 核心概念 索引 映射 文档 基本操作 索引 创建 查询 删除 映射 创建 查询 文档 添加文档 查询文档 删除文档 更新文档 批量操作 高级查询 说明 语法 常见检索 查询所有[match_all] 关键词查询(term) 范围查询[range] 前缀查询[prefix] 通配符查询…

【智能算法】人工水母搜索算法(JS)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.代码实现4.参考文献 1.背景 2020年&#xff0c;Chou 等人受到水母运动行为启发&#xff0c;提出了人工水母搜索算法(Artificial Jellyfish Search Optimizer, JS)。 2.算法原理 2.1算法思想 JS模拟了水母的搜索行为&#xf…

要将镜像推送到GitLab的Registry中的步骤

1、通过cli 模式登录gitlab &#xff08;命令行模式&#xff09; docker login git.asc-dede.de Username: haiyang Password: Login Succeeded 2、查看我的本地镜像&#xff1a; 3&#xff0c;推送镜像apollo_core到对应的gitlab项目的Registry 中 docker push registry.gi…