当前位置: 首页 > news >正文

JavaScript 基础知识回顾与复习---关于this

在JavaScript中,this是一个关键字,它在不同的上下文中引用不同的对象,其this的绑定是动态的,这主要取决于函数的调用方式。this的绑定是函数运行时才确定的而不是编写是就绑定。在我看来this就像魔法一样让人难以理解掌握,工作这么久以来我从来没有认真的静下心来学习关于this的知识,所以还需要花大量的时间去学习与练习this的使用。

对于this的误解

在正式学习this之前需要避开两个对于this的误解,这也是在我看了《你不知道的JavaScript上卷》这本书之后所学到的知识,他们分别是:1. this指向函数自身 2. this指向函数的作用域。

先来看第一个误区:this指向函数自身

// 记录nums的累加值
function foo(num){console.log('foo:'+num)this.nums ++;
}
foo.nums = 0;
for(var i = 0; i<10; i++){if(i>5){foo(i)}
}
nums // 0
这是为什么?因为this.nums没有绑定到foo函数上去
function foo1(){console.log(this) // window全局对象
}
// 也有解决方法滴,不使用this而是使用词法作用域
function foo1(num){console.log('foo:'+num)nums ++;
}
var nums = 0;
for(var i = 0; i<10; i++){if(i>5){foo(i)}
}
nums // 4

再来看第二个:this指向函数作用域

function foo2(){var a = 2;this.bar()
}
function bar(){console.log( this.a)
}

像这样bar试图通过作用域的方式去访问foo2函数中的变量,这样是访问不到的。

所以this并不会指向函数自身或者函数的作用域。this实际上是在函数调用时候才绑定的,它指向什么完全取决去函数的调用方式。

this的绑定规则

1.默认绑定

默认绑定在非严格模式下是绑定到全局对象上的,在严格模式下会绑定到undefined

var a = 2;
functin foo(){this.a // 2
}
foo()
function foo1(){"use strict"this.a // undefined
}
foo1()
2.隐式绑定

隐式绑定指的是函数的调用位置是否处于上下文对象,或者说是否被对象所包裹或拥有,一般来说将foo函数作为obj对象的引用属性添加到obj的上下文中,obj就拥有了foo函数,foo的this就绑定到了obj身上。

function foo(){this.a // 2
}
var obj = {a: 2,foo: foo
}
obj.foo // 2
3.显式绑定

可以通过call()、apply() 方法进行显式的绑定this

function foo() {this.a // 2
}
var obj = {a: 2
}
foo.call(obj) // 这句代码的意思是将foo的this绑定到obj上面
apply同理这里不再赘述
4.new绑定

通过构造一个构造函数的方式来绑定this

function foo(a){this.a = a
}
var bar = new foo(2)
bar.a // 2
这几句代码发生了什么?
1.创建一个新对象
2.这个新对象会被执行[[prototype]]连接
3.这个新对象的this会绑定到构造函数

优先级

试着想一下如果一个函数在调用时存在多个绑定规则,这时该怎么选?答案就是利用优先级规则。在这里我直接说结果吧,优先级从高到低依次是:

1.使用了new调用函数,这时this就指向了新创建的对象。

2.如果使用call或者apply直接硬性的绑定this,那么此时this就指向了指定的对象。

3.如果函数处于某个对象上下文中调用的话,那么this就指向了这个对象。

4.如果以上都不满足,则会使用默认绑定,在非严格模式下this指向全局对象,在严格模式下this指向undefined

=>箭头函数

箭头函数并不使用以上四条this的绑定规则,而是根据当前所在词法作用域(函数或者全局)来决定this的绑定,具体来说箭头函数会继承外层函数函数调用this的绑定。

function foo(){return (a)=>{console.log(a)}
}
var obj1 = {a: 2
}
foo.call(obj1)
obj1.a // 2

例外

凡事总有例外,有些时候你以为的绑定规则其实他是使用了默认绑定规则。如果你想更安全的忽略this绑定,你可以使用一个DMZ对象,或者说是一个安全区,这样就不会担心对全局对象产生影响。可以使用 var 0 = Object.create(null)创建一个空对象,他比{}更空不会创建prototype这个委托。

总结

以上就是关于JavaScript中关于this的知识总结。

  • 关于对this的两个误会:1.this指向其函数自身 2. this指定函数内部作用域。我们一定要纠正这两个误会。

  • 函数中this的绑定只有在这个函数运行时才确定,如果要知道这个函数中this绑定到了什么地方,那就要找到这个函数的实际调用位置,而并不是函数的声明位置。找到了函数的调用位置那么久可以依照以下的this绑定规则来确定this到底绑定到了那个对象上面。

  1. 如果是由new调用就绑定到新创建的对象上面。
  2. 如果是通过call或apply进行绑定,那么就会绑定到指定的对象上面。
  3. 如果是由一个对象上下文或者说在一个对象内部,就绑定到这个对象。
  4. 除了以上三条规则那就是默认绑定,在非严格模式下绑定到全局对象上,在严格模式下绑定到undefined上。
  • 如果一个一个函数调用中存在多个规则的情况下,this的绑定也是有优先级的,其优先级从高到低依次为:

  • new绑定>显示绑定>隐式绑定>默认绑定。

  • 箭头函数的this绑定,是由他自己所在外部函数上下文决定的。

相关文章:

JavaScript 基础知识回顾与复习---关于this

在JavaScript中&#xff0c;this是一个关键字&#xff0c;它在不同的上下文中引用不同的对象&#xff0c;其this的绑定是动态的&#xff0c;这主要取决于函数的调用方式。this的绑定是函数运行时才确定的而不是编写是就绑定。在我看来this就像魔法一样让人难以理解掌握&#xf…...

Lua之Lua源文件批量转换为luac字节码文件

准备的工具&#xff1a;luac.exe CSDNhttps://mp.csdn.net/mp_download/manage/download/UpDetailed Unity版: using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEngine;public static class Bat…...

简历V1.0问题合集 8/25-26

记录完 去看相应的知识点 对应着修改 &#xff08;带着问题总结 效果更好 把这一部分先过完&#xff09; Axois 1.axios.interceptors.request.use 和 response.use主要操作了什么了 你简历说了封装。这个要了解 2.axios get post put delete 请求里payload 、query string …...

P1052 [NOIP2005 提高组] 过河

[P1052 NOIP2005 提高组] 过河 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 问题描述&#xff1a;给定长度L&#xff0c;和一次可以跳动的长度 s 到 t&#xff0c;给定m个石头的位置&#xff0c;求最少经过多少个石头可以超过L。 思路&#xff1a;如果L很小的话&#xff0…...

ArrayList和Vector及LinkedList的区别

1.ArrayList和Vector的区别 第一句话&#xff1a;ArrayList和Vector底层都是数组实现的&#xff0c;初始容量都为10&#xff1b;在ArrayList的底层&#xff0c;是通过定义一个DEFAULT_CAPACITY的常量来指定的&#xff0c;而Vector的底层&#xff0c;是直接在空参构造中&#x…...

HVV爆火漏洞:最新 WPS RCE (远程命令执行) 复现

最近HVV爆出的很火的WPS命令执行漏洞&#xff0c;其实并不是0DAY&#xff0c;早在2019年就出现了&#xff0c;只不过最近EXP才公开。接下来我们来复现一遍。 0x00 影响版本 WPS Office 2023 个人版 < 11.1.0.15120WPS Office 2019 企业版 < 11.8.2.12085 0x01 环境配置…...

我的128天创作纪念日-东离与糖宝

文章目录 机缘收获日常成就憧憬 不知不觉我也迎来了自己的128天创作纪念日&#xff0c;一起来看看我有什么想对大家说的吧 机缘 我的写博客之旅始于参加了代码随想录算法训练营。在训练营期间&#xff0c;代码随想录作者卡尔建议我们坚持每天写博客记录刷题学习的进度和心得体…...

卷积神经网络——下篇【深度学习】【PyTorch】【d2l】

文章目录 5、卷积神经网络5.10、⭐批量归一化5.10.1、理论部分5.10.2、代码部分 5.11、⭐残差网络&#xff08;ResNet&#xff09;5.11.1、理论部分5.11.2、代码部分 话题闲谈 5、卷积神经网络 5.10、⭐批量归一化 5.10.1、理论部分 批量归一化可以解决深层网络中梯度消失和…...

cas md5加密

CAS Authentication Credentials #cas.authn.accept.userscasuser::Mellon 查询账号密码SQL&#xff0c;必须包含密码字段 cas.authn.jdbc.query[0].sqlselect * from ca_user where username? 指定上面的SQL查询字段名&#xff08;必须&#xff09; cas.authn.jdbc.query…...

[管理与领导-51]:IT基层管理者 - 8项核心技能 - 6 - 流程

前言&#xff1a; 管理者存在的价值就是制定目标&#xff0c;即目标管理、通过团队&#xff08;他人&#xff09;拿到结果。 要想通过他人拿到结果&#xff1a; &#xff08;1&#xff09;目标&#xff1a;制定符合SMART原则的符合业务需求的目标&#xff0c;团队跳一跳就可以…...

天翼物联、汕头电信与汕头大学共建新一代信息技术与数字创新(物联网)联合实验室

近日&#xff0c;在工业和信息化部和广东省人民政府共同主办的2023中国数字经济创新发展大会上&#xff0c;天翼物联、汕头电信与汕头大学共建“新一代信息技术与数字创新&#xff08;物联网&#xff09;”联合实验室签约仪式举行。汕头大学校长郝志峰、中国电信广东公司总经理…...

Failed to load local image resource/images/1.jpg无法加载本地图片资源

微信小程序开发无法加载本地图片 先放报错图片 绝对路径不行&#xff0c; <image src"../../images/1.jpg" mode"heightFix"></image>使用相对路径就可以了 <image src"../../images/1.jpg" mode"heightFix"><…...

Go和Java实现责任链模式

Go和Java实现责任链模式 下面通过一个审批流程的案例来说明责任链模式的使用。 1、责任链模式 责任链模式为请求创建了一个接收者对象的链。这种模式给予请求的类型&#xff0c;对请求的发送者和接收者进行解耦。这 种类型的设计模式属于行为型模式。 在这种模式中&#x…...

C#+GDAL影像处理笔记08:生成DEM的图阔范围线

目录 1 实现思路 2 源码及解析 1 实现思路 首先获取DEM数据的转换参数信息,这个信息记录了DEM的放射变换参数,包括左上角X,X方向分辨率、0、左上角Y、0、Y方向的分辨率【负值】等信息。接着是根据转换参数,计算DEM分幅数据的四至范围坐标;主要用到上一步得到的转换参数信…...

敏捷研发管理软件及敏捷管理流程

Scrum中非常强调公开、透明、直接有效的沟通&#xff0c;这也是“可视化的管理工具”在敏捷开发中如此重要的原因之一。通过“可视化的管理工具”让所有人直观的看到需求&#xff0c;故事&#xff0c;任务之间的流转状态&#xff0c;可以使团队成员更加快速适应敏捷开发流程。 …...

Mac OS 13.4.1 搜狗输入法导致的卡顿问题

一、Mac OS 系统版本 搜狗输入法已经更新到最新 二、解决方案 解决方案一 在我的电脑上面需要关闭 VSCode 和 Chrmoe 以后&#xff0c;搜狗输入法回复正常。 解决方案二 强制重启一下搜狗输入法。 可以用 unix 定时任务去隔 2个小时自动 kill 掉一次进程 # kill 掉 mac …...

vue 简单实验 自定义组件 局部注册

1.概要 2.代码 <html> </html> <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <body><div id"counter"><component-a></component-a></div> </body&g…...

Resnet模型详解

1、Resnet是什么&#xff1f; Resnet是一种深度神经网络架构&#xff0c;被广泛用于计算机视觉任务&#xff0c;特别是图像分类。它是由微软研究院的研究员于2015年提出的&#xff0c;是深度学习领域的重要里程碑之一。 2、网络退化问题 理论上来讲&#xff0c;随着网络的层…...

AI 绘画Stable Diffusion 研究(十六)SD Hypernetwork详解

大家好&#xff0c;我是风雨无阻。 本期内容&#xff1a; 什么是 Hypernetwork&#xff1f;Hypernetwork 与其他模型的区别&#xff1f;Hypernetwork 原理Hypernetwork 如何下载安装&#xff1f;Hypernetwork 如何使用&#xff1f; 在上一篇文章中&#xff0c;我们详细介绍了 …...

2023.8 -java - 继承

继承就是子类继承父类的特征和行为&#xff0c;使得子类对象&#xff08;实例&#xff09;具有父类的实例域和方法&#xff0c;或子类从父类继承方法&#xff0c;使得子类具有父类相同的行为。 继承的特性 子类拥有父类非 private 的属性、方法。 子类可以拥有自己的属性和方法…...

前端面试:【移动端开发】PWA、Hybrid App和Native App的比较

在移动端开发中&#xff0c;开发者有多种选择&#xff0c;包括渐进式Web应用&#xff08;PWA&#xff09;&#xff0c;混合应用&#xff08;Hybrid App&#xff09;和原生应用&#xff08;Native App&#xff09;。每种方法都有其独特的优势和适用场景。本文将对它们进行比较&a…...

picGo+gitee+typora设置图床

picGogiteetypora设置图床 picGogitee设置图床下载picGo软件安装picGo软件gitee操作在gitee中创建仓库在gitee中配置私人令牌 配置picGo在插件设置中搜索gitee插件并进行下载 TyporapicGo设置Typora 下载Typora进行图像设置 picGogitee设置图床 当我了解picGogitee可以设置图床…...

[JavaWeb]【十三】web后端开发-原理篇

目录 一、SpringBoot配置优先级 1.1 配置优先级比较 1.2 java系统属性和命令行参数 1.3 打包运行jar 1.4 综合优先级​编辑 二、Bean管理 2.1 获取bean 2.2 bean作用域 2.2.1 五种作用域 2.2.2 配置作用域 2.3 第三方bean 2.3.1 编写公共配置类 三、SpringBoot原理 …...

服务注册中心 Eureka

服务注册中心 Eureka Spring Cloud Eureka 是 Netflix 公司开发的注册发现组件&#xff0c;本身是一个基于 REST 的服务。提供注册与发现&#xff0c;同时还提供了负载均衡、故障转移等能力。 Eureka 有 3 个角色 服务中心&#xff08;Eureka Server&#xff09;&#xff1a;…...

SpringIoC组件的高级特性

目录 一、Bean组件的周期与作用域 二、FactoryBean接口 一、Bean组件的周期与作用域 1.1 Bean组件的生命周期 什么是Bean的周期方法 我们可以在组件类中定义方法&#xff0c;然后当IoC容器实例化和销毁组件对象的时候进行调用&#xff01;这两个方法我们成为生命周期方法&a…...

Linux--进程地址空间

1.线程地址空间 所谓进程地址空间&#xff08;process address space&#xff09;&#xff0c;就是从进程的视角看到的地址空间&#xff0c;是进程运行时所用到的虚拟地址的集合。 简单地说&#xff0c;进程就是内核数据结构和代码和本身的代码和数据&#xff0c;进程本身不能…...

ISIS路由协议

骨干区域与非骨干区域 凡是由级别2组建起来的邻居形成骨干区域&#xff1b;级别1就在非骨干区域&#xff0c;骨干区域有且只有一个&#xff0c;并且需要连续&#xff0c;ISIS在IP环境下目前不支持虚链路。 路由器级别 L1路由器只能建立L1的邻居&#xff1b;L2路由器只能建立L…...

论文解读:Bert原理深入浅出

摘取于https://www.jianshu.com/p/810ca25c4502 任务1&#xff1a;Masked Language Model Maked LM 是为了解决单向信息问题&#xff0c;现有的语言模型的问题在于&#xff0c;没有同时利用双向信息&#xff0c;如 ELMO 号称是双向LM&#xff0c;但实际上是两个单向 RNN 构成的…...

共享内存 windows和linux

服务端&#xff0c;即写入端 #include <iostream> #include <string.h> #define BUF_SIZE 1024 #ifdef _WIN32 #include <windows.h> #define SHARENAME L"shareMemory" HANDLE g_MapFIle; LPVOID g_baseBuffer; #else #define SHARENAME "sh…...

一个mongodb问题分析

mongodb问题分析 现状 表的个数&#xff1a; 生产上常用的表就10来个。 sharding cluster replica set方式部署&#xff1a; 9个shard server&#xff0c; 每个shard server 1主2从&#xff0c; 大量数据写入时或对大表创建索引时&#xff0c;可能有主从复制延迟问题。实…...

哪个网站可以领单做效果图/当日网站收录查询统计

在企业中&#xff0c;会有多人使用同一个exchange邮箱的情况&#xff0c;这些人在自己的机器上配置outlook客户端&#xff0c;使用MAPI协议连接到exchange 2010.默认outlook MAPI方式连接exchange服务器&#xff0c;最大的session数为16个&#xff0c;超过16个用户同时使用一个…...

做网络歌手的网站/百度一下你就知道123

比explain更加详细的分析计划&#xff1a;Query Profiler 2019-05-10 14:47:45 阅读&#xff1a;78 来源&#xff1a; 互联网 标签&#xff1a;profile show explain sql profiles Profiler query Query 一、前言 这篇博客是之前总结的一个知识点&#xff0c;也是偶然看别人…...

wordpress解压主题没反应/18岁以上站长统计

在上一篇文章中实现了一个非常简陋的 MyDict 类&#xff0c;仅仅可以 get 、set &#xff0c;其他的各种功能都没有&#xff0c;甚至连在 Python shell 中正常的表示都做不到。这篇文章将会继续完善这个字典类&#xff0c;并同时简单介绍用到的 Python 魔术方法。 目前的 MyDic…...

有赞做网站/深圳网络营销推广中心

二.信息化与现代管理 ◆浅述企业的管理活动 价值活动是一个企业所进行的在物质形态上和技术上都界限分明的活动&#xff0c;是企业赖以创造出价值的基石。把企业创造价值的过程分解为一系列互不相同又相互关联的价值活动&#xff0c;其总和即构成企业的“价值链”。 价…...

泰州哪家做网站建设比较好/网络营销策划书

问题来源: http://www.cnblogs.com/del/archive/2009/06/05/1496857.html#1549294TTrayIcon 的主要属性:TrayIcon.Icon指定托盘图标, 有几种用法:1、设计时选择;2、把一个 TIcon 对象给它;3、使用当前程序图标: TrayIcon1.Icon : Application.Icon;4、TrayIcon1.SetDefaultIcon…...

深圳市住房和城乡建设委员会网站/网上卖产品怎么推广

2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单&#xff08;2018&#xff09;请戳&#xff08;这里&#xff09; 【今日歌曲】 花间小酌 &#xff1a;分享Delacey的单曲《Dream It Possible》--今日循环的歌曲 《Dream It Possible》- Delacey 手机党少年们…...