前端:JavaScript中的this

news2024/11/13 9:33:14

前端:JavaScript中的this

    • 1. this的指向
    • 2. 指定this的值
    • 3. 手写call方法
    • 4. 手写apply方法
    • 5. 手写bind方法

1. this的指向

在非严格模式下,总是指向一个对象;在严格模式下可以是任意值。
开启严格模式,如果是为整个脚本开启,直接在当前脚本第一行代码写上如下代码:

'use strict'

如果是为函数开启严格模式,则是在函数第一行写上上述代码:

function a(){
    'use strict'
}
  1. 全局执行环境中,指向全局对象即window(严格、非严格模式);
  2. 函数内部,取决于函数被调用的方式。如果直接调用this,严格模式下为undefined,非严格模式下为全局对象(window);如果采用对象方法调用的this, 则指向调用者(严格、非严格)

直接调用

function a(){
 	console.log(this);
 }
 function b() {
     'use strict'
     console.log(this);
 }
 a() // window
 b() // undefined

对象方法调用

const food = {
	name:'西瓜',
    dec(){
        console.log(this)
    }
}
const food2 = {
    name: '香蕉',
    dec() {
        'use strict'
        console.log(this)
    }
}
food.dec() // food这个对象
food2.dec() // food2这个对象

2. 指定this的值

  • 调用时指定,call、apply(数组传递参数)
  • 创建时指定,bind,箭头函数

call使用如下:

func.call(thisArg,参数1,参数2...)
function func(num1,num2){
    console.log(this);
    console.log(num1,num2);
 }
 const person = {
     name:'baidu'
 }
 func.call(person,1,2)

在这里插入图片描述

apply使用如下:

func.apply(thisArg,[参数1,参数2...])
function func(num1,num2){
    console.log(this);
    console.log(num1,num2);
 }
 const person = {
     name:'baidu'
 }
 func.apply(person,[2,3])

在这里插入图片描述

bind使用如下:

func.bind(thisArg,绑定参数1,绑定参数2...)
function func(num1,num2){
    console.log(this);
    console.log(num1,num2);
 }
 const person = {
     name:'baidu'
 }
 const bindFunc = func.bind(person,77)
 bindFunc(88)

在这里插入图片描述

箭头函数
使用普通函数,此时最里层的this指向window

const person = {
     name:'baidu',
     hh(){
         console.log(this);
         setTimeout(function(){
             console.log(this);
         },1000)
     }
 }
 person.hh()

在这里插入图片描述
使用箭头函数,最里层的this指向其外层的this值。

const person = {
     name:'baidu',
     hh(){
         console.log(this);
         setTimeout(()=>{
             console.log(this);
         },1000)
     }
 }
 person.hh()

在这里插入图片描述

3. 手写call方法

任何定义的函数都是属于Function类型,那么只需要在Function其原型上添加一个call方法,其他自定义的函数上均可以使用call方法,这里定义的call方法名为myCall。

Function.prototype.myCall = function(thisArg,...args){
    thisArg.f = this
    // this指向调用myCall的那个函数
    const res = thisArg.f(...args)
    // 传递进来的args参数为数组类型
    delete thisArg.f
    return res
}

但是上述还存在一个问题,那就是如果thisArgs这个对象上也刚好存在f属性,上述操作会把原对象thisArgs的f属性去掉。因此可以考虑使用Symbol,Symbol无论调用多少次,其返回值均是唯一的。

function func(num1, num2) {
  	console.log(this);
    console.log(num1, num2);
 }
 const person = {
     name: 'baidu'
 }
 Function.prototype.myCall = function(thisArg,...args){
     const key = Symbol('key');
     thisArg[key] = this
     // this指向调用myCall的那个函数
     const res = thisArg[key](...args)
     delete thisArg[key]
     return res
 }
 func.myCall(person,22,33)

运行结果:
在这里插入图片描述

4. 手写apply方法

和myCall类似,只是传递参数不同而已。

function func(num1, num2) {
 	console.log(this);
    console.log(num1, num2);
}
const person = {
    name: 'baidu'
}
Function.prototype.myApply = function(thisArgs,args){
    const key = Symbol('key')
    thisArgs[key] = this
    const res = thisArgs[key](...args)
    delete thisArgs[key]
    return res
}
func.myApply(person,[44,66])

在这里插入图片描述

5. 手写bind方法

function func(num1, num2) {
	console.log(this);
    console.log(num1, num2);
}
const person = {
    name: 'baidu'
}
Function.prototype.myBind = function(thisArgs,...args){
    return (...newArgs)=>{
        return this.call(thisArgs,...args,...newArgs)
    }
}
const myBindFunc = func.myBind(person,1)
myBindFunc(2)

箭头函数中this指向func,即其调用者(外层this的指向)
在这里插入图片描述

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

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

相关文章

mapActions辅助函数的使用

什么是mapActions? mapActions 是 Vuex 提供的一个辅助函数,它允许你将组件中的方法映射为 Vuex 中的 Actions,以便于你可以直接从组件内部调用这些 actions。通过使用 mapActions 你可以在组件中以函数的方式引用 Vuex 中的 Actions,从而避…

个人随想-一道简单的AI面试题

大模型的兴起,很多公司现在都开始进入AI开发的新篇章,那么或多或少​也需要招聘一些AI的开发人员。 其实很多公司需要的,说白了就是一个AI开发工程师或者架构师,但是在招聘过程中,或多或少对要求写的太过夸张&#xf…

​在乙游热潮中,Soul App创新社交玩法,寻找年轻人的精神共鸣

经过8月份的连续事件,社会公众对于乙女游戏(下文简称乙游)有了全新的认知。 起初,是女子举重奥运冠军罗诗芳在社交平台与热门乙游《恋与深空》的意外互动,引发了广泛关注。“奥运冠军也玩乙游”成为社交平台热搜话题,众多玩家讨论奥运冠军是否会与他们有共同的虚拟角色喜好。 …

链动2+1:高效用户留存与增长的商业模式解析

大家好,我是吴军,任职于一家致力于创新的软件开发企业,担任产品经理的职位。今天,我打算深入分析一个历经时间考验且依旧充满活力的商业模式——“链动21”模式,并通过一个具体的案例和相关数据,展示它如何…

检测Meaven是否安装成功

一.配置本地仓库 1.创建一个文件夹用来存放jar包 2.解开第53行的注释,将存放jar包的路径复制 二.配置阿里云 三.配置jdk环境 1.JAVA_HOME 2.path地址里面配置BIN目录 四.配置Meaven_HOME 1.Meaven_HOME 2.path地址里面配置BIN目录 五.检查是否安装成功 1.mvn-v mvn -v 2.…

Redis 篇-深入了解分布式锁 Redisson 原理(可重入原理、可重试原理、主从一致性原理、解决超时锁失效)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 本章目录 1.0 基于 Redis 实现的分布式锁存在的问题 2.0 Redisson 功能概述 3.0 Redisson 具体使用 4.0 Redisson 可重入锁原理 5.0 Redisson 锁重试原理 6.0 Redisson WatchDo…

盘点:当养生茶遇上互联网,都有哪些打法?

健康行业电商大战早已拉开序幕,作为健康行业的一个大类——养生茶还能缺席么?三好夫人、同仁堂、东韵、九芝堂、余庆堂等等各路豪杰齐聚养生茶电商,看他们如何各显神通吧! 三好夫人——一生只送一人 三好夫人以爱之名创立&#x…

Python进程间网络远程通讯方式:socket、pipe、RPC详解!

背景 最近在进行开发工作的时候,遇到了一个场景: pc程序需要和安卓设备进行通讯和接口调用。 此时就需要进行远程调用方法。然而大学时代有关于远程过程调用的知识都还给了老师……所以在此进行一个复习,并进行实战演练! 网络…

风趣图解LLMs RAG的15种设计模式-第三课

设计模式9-重新排名以优化搜索结果 设计模式10-使用上下文压缩优化搜索结果 设计模式11-使用纠正RAG对检索文档打分和过滤 今天先讲这些吧

java网络编程TCP通信实战:共享聊天室

目录 创建服务端 建立ServerSocket服务端。 接下来就是服务端线程的编写 前端ui登录界面 客户端线程 群聊界面 package server;import java.net.ServerSocket; import java.net.Socket; import java.util.HashMap; import java.util.Map;public class Server {//定义一个集…

DBC中一种特殊的特殊的Signal—多路复用Signal

前言: DBC设计中一般设计Signal时其实存在三种类型,如下图所示: **1)步骤1,鼠标单击展开Message,选中底下的Signal **2)步骤2,弹出dialog中选择 map signal **3)得到…

深入解读Docker核心原理:Cgroups资源限制机制详解

在容器化技术中,除了资源的隔离,如何有效地控制和分配系统资源同样至关重要。Cgroups(Control Groups) 是Linux内核提供的一个强大机制,允许限制、监控和隔离进程组的系统资源使用情况。Cgroups是Docker实现容器资源限…

用RNN(循环神经网络)预测股票价格

RNN(循环神经网络)是一种特殊类型的神经网络,它能够处理序列数据,并且具有记忆先前信息的能力。这种网络结构特别适合于处理时间序列数据、文本、语音等具有时间依赖性的问题。RNN的核心特点是它可以捕捉时间序列中的长期依赖关系…

【项目】云备份

云备份 云备份概述框架 功能演示服务端客户端 公共模块文件操作模块目录操作模块 服务端模块功能划分功能细分模块数据管理热点管理 客户端模块功能划分功能细分模块数据管理目录检查文件备份 云备份 概述 自动将本地计算机上指定文件夹中需要备份的文件上传备份到服务器中。…

【网络原理】❤️Tcp 核心机制❤️ 通晓可靠传输的秘密, 保姆式教学, 建议收藏 !!!

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

QT QxOrm CRUD增删改查mysql数据库操作

QT QxOrm CRUD增删改查mysql数据库操作 QxOrm 是一个 C 库,旨在为 C 用户提供对象关系映射 (ORM) 功能。 基于每个类的简单 C 设置函数(如 Java 中的 Hibernate XML 映射文件),QxOrm 库提供以下功能: 持久性&#xff1…

安宝特案例 | AR如何大幅提升IC封装厂检测效率?

前言:如何提升IC封装厂检测效率? 在现代电子产品的制造过程中,IC封装作为核心环节,涉及到复杂处理流程和严格质量检测。这是一家专注于IC封装的厂商,负责将来自IC制造商的晶圆进行保护、散热和导通处理。整个制程繁琐…

C语言俄罗斯方块(VS2022版)

C语言俄罗斯方块 演示视频一、前置知识1.Win32 API 的使用2.宽字符的使用 二、封装核心数据与框架介绍三、核心操作介绍旋转操作检测操作水平检测竖直检测代码化简 四、源码展示在 tetris.h 中:在 tetris.c 中:在 test.c 中: 以下代码环境为 …

小阿轩yx-Zabbix企业级分布式监控环境部署

小阿轩yx-Zabbix企业级分布式监控环境部署 前言 “运筹帷幄之中,决胜千里之外”监控在 IT 运维中占据着重要地位,按比例说占 30% 也不为过在监控系统开源软件中有很多可选择的工具,但是真正符合要求的、能够真正解决业务问题的监控系统软件…

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,…