this关键字的简明指南与理解

news2025/1/10 16:19:40

this关键字是执行上下文中的一个属性,它主要用在函数内部,指向最后一次调用该函数的对象。然而,this 的值并不是在函数定义时确定的,而是在函数被调用时根据函数的调用方式动态绑定的。以下是对 this 的一些相关理解。

一、this的理解

1. 全局上下文中的 this

在全局上下文中,就是不在任何函数内部,this 指向全局对象。在浏览器环境中,全局对象是 window;在 Node.js 环境中,全局对象是 global

console.log(this);
console.log(this === window); // 在浏览器中为 true 
console.log(this === global); // 在 Node.js 中为 true

2. 函数上下文中的 this

(1)非严格模式

在普通函数中,this 的值取决于函数是如何被调用的。

一个函数作为一个对象的方法来调用,this指向这个对象。

let obj = {
    name: 'obj',
    fn: function (){
        console.log(this);
    } 
}
obj.fn();

作为普通函数被调用或直接调用函数名,this 指向全局对象(在浏览器中为 window,在 Node.js 中为 global)。

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

(2)严格模式

在严格模式下,如果 this 没有被显式设置,例如通过 call()apply() 或 bind()则 this 的值会是 undefined

3. 箭头函数中的 this

箭头函数不绑定自己的 this,它会捕获其所在上下文的 this 值,作为自己的 this 值。所以在箭头函数中,this 的值是基于函数或全局上下文来确定的。

const obj3 = { 
    method: function() { 
        console.log(this); // obj 
        const arrowFunc = () => { 
            console.log(this); // obj,箭头函数继承外围函数的this 
        }; 
        arrowFunc(); 
    } 
}; 
obj3.method();

4. 构造函数中的 this

在构造函数中,通过new运算符创建的函数调用,this指向新创建的对象实例。

function Person(name) {
    this.name = name;
}
let person = new Person('Alice');
console.log(person);

二、改变this的指向

在JavaScript中,callapplybind方法都是用来改变函数执行时this的指向的。下面解释这三个方法中的this行为。

1. call 方法

call方法允许调用一个函数,接收参数第一个是this绑定的对象,后面的参数是传入函数执行的参数。

function greet(greeting, punctuation) { 
    console.log(greeting + ', ' + this.name + punctuation); 
} 
const man = { 
    name: 'Alice' 
}; 
greet.call(man, 'Hello', '!'); // 输出: Hello, Alice!

//这个例子中,greet.call(person, 'Hello', '!')调用了greet函数,并将this在greet函数体内部设置为person对象

2. apply 方法

apply方法的作用与call方法类似,也是调用一个函数,接受两个参数:第一个参数是this的绑定的对象,第二个参数是一个数组(或类数组对象),该数组的元素将作为单独的参数传给函数。

function greet1(greeting, punctuation) { 
    console.log(greeting + ', ' + this.name + punctuation); 

} 
const man1 = { 
    name: 'Bob' 
}; 
greet1.apply(man1, ['Hi', '.']); // 输出: Hi, Bob.

//这个例子中,greet.apply(person, ['Hi', '.'])调用了greet函数,并将this在greet函数体内部设置为person对象,同时传入了两个参数'Hi'和'.'

3. bind 方法

callapply不同,bind方法不会立即执行函数,而是返回一个新的函数。这个新函数在被调用时,其this值被指定为bind方法的第一个参数,而其余参数将作为新函数的参数,供调用时使用。

function greet(greeting, punctuation) { 
    console.log(greeting + ', ' + this.name + punctuation); 
} 
const man2 = { 
    name: 'Charlie' 
}; 
const boundGreet = greet.bind(man2, 'Howdy'); 
boundGreet('!'); // 输出: Howdy, Charlie!

//这个例子中,greet.bind(person, 'Howdy')创建了一个新的函数boundGreet,其this值被绑定为person对象,并且'Howdy'作为第一个参数被预置。当boundGreet被调用时,'!'作为第二个参数传入,与'Howdy'一起被greet函数处理

注意:.bind()表示创建一个新函数,并不会调用任何函数,所以要自己调用一遍

4.call()和apply()的区别

主要区别在于它们接收参数的方式不同:

call()方法接收一个this参数和一系列单独的参数(是分散的)。

apply()方法接收一个this参数和一个包含所有参数的数组或类数组对象(是打包的)。

总结来说,callapplybind都是用来改变函数执行时this指向的方法,但它们各自的使用场景和方式有所不同。callapply是立即执行的,而bind是返回一个新的函数供后续调用。

总结

理解 this 的关键在于认识到它的值是动态绑定的,依赖于函数的调用方式。通过明确函数调用的上下文或使用箭头函数(在适当时),可以帮助减少这种混淆。

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

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

相关文章

Scrapy 爬取旅游景点相关数据(七):利用指纹实现“不重复爬取”

本期学习: 利用网页指纹去重 众所周知,代理是要花钱的,那么在爬取(测试)巨量网页的时候,就不可能对已经爬取过的网站去重复的爬,这样会消耗大量的时间,更重要的是会消耗大量的IP (金…

redis的高可用及性能管理和雪崩

redis的高可用 redis当中,高可用概念更宽泛一些。 除了正常服务以外,数据量的扩容,数据安全。 实现高可用的方式: 1、持久化 最简单的高可用方法,主要功能就是备份数据。 把内存当中的数据保存到硬盘当中。 2、主…

如何有效增加谷歌外链?

想有效增加谷歌外链,其实还是要看你想要哪一种外链,但无论哪一种外链,都不能乱发,想有效的增加谷歌外链,看见明显的数据变化,这里只推荐三种外链,GPB,GNB,GMB 目前市面上最有效的外链…

负载驱动下的滚珠丝杆预压力优化策略!

滚珠丝杆的预紧力是指在未受到负载时,滚珠丝杆轴承内部的压力,主要是为了消除轴向后隙,‌减小轴向力引起的弹性位移,‌从而提高滚珠丝杆的刚度。‌这种预压机制通过独特的滚珠与珠槽接触模式实现,‌旨在增加系统的刚性…

物联网服务器搭建及部署详细说明:掌握 Node.js、MongoDB、Socket.IO 和 JWT 的实用指南

关键知识点目录 1. 环境准备 1.1 硬件要求 1.2 软件要求 2. 搭建步骤 3. 数据处理与存储 3.1 数据存储 3.2 数据实时处理 3.2.1 安装 Socket.IO 3.2.2 修改服务器代码 4. 安全性 4.1 身份验证与授权 4.2 加密通信 4.2.1 生成自签名证书(开发环境&#…

html必知必会-html内嵌JavaScript和文件路径

文章目录 HTML JavaScriptHTML <script> 标签JavaScript 的简单示例HTML <noscript> 标签HTML 文件路径绝对文件路径相对文件路径总结 HTML JavaScript JavaScript 使 HTML 页面更具动态性和交互性。 示例 <!DOCTYPE html> <html> <body><…

iOS18使用技巧:iPhone通话录音开启教程和注意事项

今日早些时候&#xff0c;苹果为iPhone 15 Pro系列的开发者预览版用户推送了iOS 18.1 Beta1测试版的更新&#xff0c;已经注册Apple Beta版软件计划的用户只需打开设置--通用--软件更新即可在线OTA升级至最新的iOS 18.1 Beta1测试版。 说起iOS 18.1最重磅的更新&#xff0c;莫过…

Redis7-入门-安装

1.Redis是什么 REmote Dictionary Server(远程字典服务器) Remote Dictionary Server(远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c;是一个高性能的Key-Value数据库提供了丰富的数据结构&#xff0c;例如String、Hash、List、set、Sorteds…

程序员学长 | 快速学会一个算法,ANN

本文来源公众号“程序员学长”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;快速学会一个算法&#xff0c;ANN 今天给大家分享一个强大的算法模型&#xff0c;ANN。 人工神经网络 (ANN) 是一种深度学习方法&#xff0c;源自人类…

【C++BFS】1020. 飞地的数量

本文涉及知识点 CBFS算法 LeetCode1020. 飞地的数量 给你一个大小为 m x n 的二进制矩阵 grid &#xff0c;其中 0 表示一个海洋单元格、1 表示一个陆地单元格。 一次 移动 是指从一个陆地单元格走到另一个相邻&#xff08;上、下、左、右&#xff09;的陆地单元格或跨过 gr…

html+css 炫酷的流边按钮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽效果&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 文…

详细教程:在Octo Browser指纹浏览器中配置IPXProxy代理IP的步骤

​Octo Browser是一款反检测指纹浏览器&#xff0c;可防止在线跟踪并保护用户隐私的网络浏览器。用户可以在Octo Browser中设置代理IP&#xff0c;来进行多账户的管理&#xff0c;降低账户关联的风险。下面以IPXProxy代理IP为例&#xff0c;告诉大家如何在Octo Browser指纹浏览…

顺序栈*链栈

逻辑结构,存储结构,运算 栈的定义 栈是只能在一端进行插入,删除操作的线性表; 栈的操作特征为先进后出,栈的逻辑结果为线性结构,是一种特殊的线性表. 栈顶:允许插入,删除 栈底:不允许插入删除 存储结构--顺序存储 (1)定义 #include<stdio.h> #define MaxSize 10 /…

哪些洗地机比较好?揭晓中国十大名牌洗地机

在当今追求高效与品质生活的时代&#xff0c;洗地机作为现代家居清洁的得力助手&#xff0c;其重要性日益凸显。为了帮助大家在众多品牌中筛选出优质之选&#xff0c;我们精心揭晓中国洗地机领域的十大名牌。这些品牌凭借卓越的性能、创新的技术以及良好的用户口碑&#xff0c;…

开启mybatis-plus日志功能

第一部分&#xff1a;配置文件增添参数 增加如下&#xff1a; configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 第二部分&#xff1a;运行效果展示

大数据信用报告一般都是在哪里查询?

相信现在有不少人都听说过大数据信用&#xff0c;其实早在几年前&#xff0c;大数据就已经作为银行和借贷机构审核申贷人的重要途径&#xff0c;因为传统的征信报告有一定的局限性&#xff0c;无法全方位的了解申贷人的隐形负债&#xff0c;大数据信用报告的作用就显现出来了&a…

Ansys Zemax|如何模拟复杂的菲涅尔透镜

附件下载 联系工作人员获取附件 概述 这篇文章介绍了如何模拟每个菲涅尔环都由不同数据定义的复杂菲涅尔透镜。这种方法也可以用于定义复杂物体。 介绍 菲涅尔透镜与普通透镜有所区别&#xff0c;它是将普通透镜连续、光滑的表面分成一系列同心圆环&#xff0c;这些同心圆环…

手机高清录屏,快速学会的2种绝妙方法!

在移动互联时代&#xff0c;手机不仅仅是通讯工具&#xff0c;更是我们记录生活、分享经验、创作内容的得力助手。而手机高清录屏功能&#xff0c;则为我们捕捉手机屏幕上的每一帧精彩提供了便捷的方式。无论是游戏直播、教学演示&#xff0c;还是视频制作&#xff0c;手机高清…

创建自己的 Omnigraph (python篇)

Omnigraph 是 Nvidia Omniverse 中一个强大的视觉化脚本工具&#xff0c;它让开发者能够以直观和灵活的方式创建复杂的行为和交互性。通过结合 Action Graphs 和 Push Graphs&#xff0c;以及利用丰富的节点库&#xff0c;用户可以在 Omniverse 平台上构建出令人惊叹的虚拟世界…

Ubuntu虚拟机扩容笔记(各种方法都不行版)

1.背景介绍 最近需要对ubuntu的虚拟机下面的挂载根目录上的文件系统对应的硬盘进行扩容&#xff0c;在虚拟机管理平台对磁盘进行扩容后&#xff0c;在图形界面上尝试扩容&#xff1a; 尝试教程主要采用下面教程的第三种方法&#xff1a; Ubuntu22.04 Linux磁盘扩容/硬盘扩展…