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

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

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

相关文章

EOS 与ESD 区别

ESD: 英文&#xff1a;Electrical Static Discharge&#xff1b; 定义&#xff1a;不同静电电位的两个物体之间的电荷转移&#xff1b;中文释为静电放电。静电是一种客观的自然现象&#xff1b; EOS&#xff1a; 英文&#xff1a;Electrical Over Stress 定义&#xf…

架构设计的核心目的与意义

以史为鉴&#xff0c;对我们了解架构设计的目的很有帮助。谈到架构设计&#xff0c;相信每个技术人员都是耳熟能详&#xff0c;但如果深入探讨一下&#xff0c;“为何要做架构设计&#xff1f;”或者“架构设计目的是什么&#xff1f;”类似的问题&#xff0c;大部分人可能从来…

宠物疾病 与 光线疗法

人类与动物以及大自然是相辅相成的。人离开动物将无法生存&#xff0c;对于动物我们尽力去保护&#xff0c;与大自然和谐稳定生存发展。 生息在地球上的所有动物、在自然太阳光奇妙的作用下、生长发育。太阳光的能量使它们不断进化、繁衍种族。现在、生物能够生存、全仰仗于太…

操作系统——cpu、内存、缓存介绍

一、内存是什么 内存就是系统资源的代名词&#xff0c;它是其他硬件设备与 CPU 沟通的桥梁&#xff0c; 计算机中的所有程序都在内存中运行。其作用是暂时存放CPU的运算数据&#xff0c;以及与硬盘交换的数据。也是相当于CPU与硬盘沟通的桥梁。只要计算机在运行&#xff0c;CP…

DataGrip 面试题及答案整理,最新面试题

DataGrip的数据库兼容性和多数据库支持如何实现&#xff1f; DataGrip实现数据库兼容性和多数据库支持的方式包括&#xff1a; 1、广泛的数据库支持&#xff1a; DataGrip支持多种数据库&#xff0c;包括但不限于MySQL, PostgreSQL, SQL Server, Oracle, SQLite, 和MongoDB&a…

C语言内存函数详解

文章目录 前言一、memcpy函数&#xff08;内存拷贝函数&#xff09;二、memmove重叠拷贝函数三.memset内存设置函数四.memcmp内存比较函数总结 前言 我们之前按学习了C语言标准库中提供了一系列的字符和字符串库函数&#xff0c;接下来我们就学习一下关于内存相关的一些函数。…

Java-并发编程--ThreadLocal、InheritableThreadLocal

1.ThreadLocal 作用 作用&#xff1a;为变量在线程中都创建副本&#xff0c;线程可访问自己内部的副本变量。该类提供了线程局部 (thread-local) 变量&#xff0c;访问这个变量&#xff08;通过其 get 或 set 方法&#xff09;的每个线程都有自己的局部变量&#xff0c;它独立…

二次开发 vs2022+Autocad24

一、下载SDK 下载地址: AutoCAD DXF Archive | Autodesk Developer Network 安装SDK 选择解压的文件路径 二、下载ObjectARX Wizard 下载地址:AutoCAD API | Autodesk Platform Services (APS)

进程学习--02

在C语言中&#xff0c;一般使用fork函数开辟进程&#xff0c;这个函数开辟进程后会返回一个进程号&#xff0c;在子进程中会返回0&#xff0c;在父进程中会返回子进程的进程号。 int main(){int ret fork();if(ret<0){fprintf(stderr, "pid error");exit(-1);}e…

微服务:Bot代码执行

每次要多传一个bot_id 判网关的时候判127.0.0.1所以最好改localhost 创建SpringCloud的子项目 BotRunningSystem 在BotRunningSystem项目中添加依赖&#xff1a; joor-java-8 可动态编译Java代码 2. 修改前端&#xff0c;传入对Bot的选择操作 package com.kob.botrunningsy…

突破编程_前端_JS编程实例(工具栏组件)

1 开发目标 工具栏组件旨在模拟常见的桌面软件工具栏&#xff0c;所以比较适用于 electron 的开发&#xff0c;该组件包含工具栏按钮、工具栏分割条和工具栏容器三个主要角色&#xff0c;并提供一系列接口和功能&#xff0c;以满足用户在不同场景下的需求&#xff1a; 点击工具…

FFmpeg工作流程及视频文件分析

FFmpeg工作流程: 解封装(Demuxing)--->解码(Decoding)--->编码(Encoding)--->封装(Muxing) FFmpeg转码工作流程: 读取输入流--->音视频解封装--->解码音视频帧--->编码音视频帧--->音视频封装--->输出目标流 可简单理解为如下流程: 读文件-->解…