重走前端路JS进阶篇:This 指向与箭头函数

Angular Renderer2:跨平台DOM操作的唯一安全入口 Renderer2 是 Angular 框架为 DOM 操作设计的核心抽象层,它将样式修改、事件绑定、元素创建等行为封装为与运行环境解耦的标准化接口。其底层原理基于面向接口编程与平台特定实现(如 DefaultDomRenderer2、ServerRenderer2),天然支持服务端渲染(SSR)、Web Worker 和 WebView 等多端场景。技术价值在于消除 `document is not defined` 等环境依赖错误,提升代码可测试性与可维护性,并通过 `setStyle`、`listen 阅读详情

JavaScript 高级

This 指向规则

案例

    function foo() {
        console.log(this)
    }
    // 1 调用方式1
    foo();
    // 2 调用方式2 放入对象中调用
    var obj = {
        name: "why",
        foo: foo
    }
    obj.foo()

    // 调用方式三 通过 call/apply 调用
    foo.call("abc")

image-20230223171236633

指向定义

this 是js 给函数的一个绑定值。

  1. 函数在调用时 JavaScript会默认给this绑定一个值;
  2. this的绑定和定义的位置(编写的位置)没有关系;
  3. this的绑定和调用方式以及调用的位置有关系
  4. this是在运行时被绑定的

无严格模式下 为 window 如果打开严格模式 则为 udnefined

this 的绑定规则如下:

  1. 绑定一:默认绑定 PS: 没有绑定到任何对象时 & 函数定义在对象中但是被独立调用 对象也是 window

  2. 绑定二:隐式绑定 PS:由JS 绑定到调用对象 指向对象

  3. 绑定三:new绑定

    • new 执行过程
    • 1 创建空对象
    • 2 修改this 指向为空对象
    • 3 执行函数体代码
    • 没有显示返回非空对象时 默认返回这个对象
  4. 绑定四 显示绑定

    • 如果我们不希望在 对象内部 包含这个函数的引用,同时又希望在这个对象上进行强制调用

    • function foo() {
              console.log(this)
      }   
      var obj = {
               name: "why",
             foo: foo
          }
      foo.call(123)
      
      console 输出内容 {name: 'why', foo: ƒ}
      
    • call/apply 可以帮助我们完成这个效果

额外函数补充

Call / Apply 调用方法 两者区别不大 但是又细微差别

apply:

    function foo(name, age, height) {
        console.log("foo 函数this 指向", this);
        console.log("参数:", name, age, height);
    }
 
    // 普通调用  直接入参
    foo("why", 18, 1.22)
    // apply
    // 第一个参数 绑定 this 
    // 第二个参数 传入额外的实参 以数组的形式
    //   foo.apply("apply",["why", 18, 1.22])
    foo.apply("123", ["why", 18, 1.22])

call:

    function foo(name, age, height) {
        console.log("foo 函数this 指向", this);
        console.log("参数:", name, age, height);
    }

    // call
    // 第一个参数 绑定 this
    // 后续参数以 参数列表形式 
    foo.call("call", "远目鸟", 18, 12)

两者 相同处 都是调用方法 第一参数都指向this 唯一区别只在后续传入的参数的形势

  • apply 为数组
  • call 为列表 以 , 分割

bind :会创建 绑定函数 我们希望调用foo 的时候总是让this 指向 obj

    function foo() {
        console.log("foo 函数this 指向", this);
    }
    var obj = {
        name: "why"
    }

    // 需求 调用foo时 总是绑定 obj 
    var bar = foo.bind(obj)
    bar()

在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。 实际开发中 使用不多 作为参考 了解即可

内置函数

一般 对于浏览器 的内置函数 或者是第三方框架的 this 指向 我们只能用经验去判断 一个一个去源码或者文档查看和并不现实

This 优先级

  1. 默认绑定 优先级最低
  2. 显式绑定 高于隐式绑定
  3. new 高于隐式绑定 PS:new不能和 call/apply 一起使用
  4. new绑定优先级高于bind
  5. 同显式 bind 优先级高于 call/apply

拓展: 规则之外

**情况一:**如果在显示绑定中,我们传入一个null或者undefined,那么这个显示绑定会被忽略,使用默认规则:

    function foo() {
        console.log("foo 函数this 指向", this);
    }
    var obj = {
        name: "why"
    }

    foo.call(obj)
    foo.call(null)
    foo.call(undefined)

    var bar = foo.bind(obj)
    bar()

但是打开严格模式 就会可以使用基础属性 直接显示 null 或者 undefined

**情况二:**创建一个函数的 间接引用,这种情况使用默认绑定规则。

  • 这种情况 (obj2.foo = obj1.foo) 会使用默认规则 指向 window
    var obj1 = {
        name: "obj1",
        foo: function () {
            console.log("foo 函数this 指向", this);
        }
    }

    var obj2 = {
        name: "obj2"
    };

    obj1.foo();
    (obj2.foo = obj1.foo)();

**情况三:**箭头函数

  • 箭头函数不会绑定this、arguments属性
  • 箭头函数不能作为构造函数来使用
    // {} 是执行体
    var arrFn = () => { }
    // 指向的是对象 需要加小括号才可以做到
    var arrFn = () => ({ name: "why" })

箭头函数

  • 基本写法

    • ():函数的参数

    • {}:函数的执行体

    •     var foo3 = (name, age) => {
            console.log("箭头函数的函数体")
            console.log(name, age)
          }
      
  • 优化写法

    • 只有一个参数时, 可以省略()

          names.forEach(item => {
             console.log(item)
          })
      
    • 只有一行代码时, 可以省略{}

      names.forEach(item => console.log(item))
      
    • 只要一行代码时, 表达式的返回值会作为箭头函数默认返回值, 所以可以省略return

      var newNums = nums.filter(item => item % 2 === 0)
      var newNums = nums.filter(item => item % 2 === 0)
      
    • 如果箭头函数默认返回的是对象, 在省略{}的时候, 对象必须使用()包裹 () => ({name: “why”})

          var arrFn = () => ["abc", "cba"]
          var arrFn = () => {} // 注意: 这里是{}执行体
          var arrFn = () => ({ name: "why" })
          console.log(arrFn())
      

箭头函数不使用this的四种标准规则(也就是不绑定this),而是根据外层作用域来决定this。

我们来看一个模拟网络请求的案例:

  • 这里我使用setTimeout来模拟网络请求,请求到数据后如何可以存放到data中呢?
  • 我们需要拿到obj对象,设置data;
  • 但是直接拿到的this是window,我们需要在外层定义:var _this = this
  • _在setTimeout的回调函数中使用_this就代表了obj对象
  • 但是如果使用箭头函数根据特性他会向上寻找this 省去了_this = this的操作
    var obj = {
        data: [],
        getData: function () {
            request("/11", (res) => {
                this.data = [].concat(res)
            })
        }
    }

    function request(url, callbackFn) {
        var res = ["abc", "cba", "nba"]
        callbackFn(res)
    }
    obj.getData()

总结

  1. this的指向问题与优先级 是踏入JS的敲门砖,如果不先系统了解之后使用的时候可能会出现奇怪的错误
  2. 使用ES6的语法 箭头函数 提前熟悉ES6语法可以提升开发效率
纯CSS实现箭头 纯CSS实现箭头 display: inline-block; margin: 72px; border-right: 24px solid; border-bottom: 24px solid; width: 120px; height: 120px; transform: rotate(-45deg); 立即下载

相关推荐

基于STM32的频率计(采用外部中断的方式)

前言 最近在了解电赛相关的东西,和指导老师交流一下,我决定先从最简单的频率计做起。 频率计是来检测信号的频率的,在做频率计的时候可以用信号发生器发出的信号来进行测试。 原理 这是最基础的方波,我们可以通过检测上升沿的方式来测量其频率。从周期的角度出发连续两个上升沿的时间就是这个方波的周期,那这个周期分之一就是这个方波的频率了。 在思考了一段时间~~(我是萌新。。)~~ 我觉得有两个方法可以实现,第一个是采用stm32定时器的输入捕获功能,第二个就是用外部中断来实现这个功能。正如标题,我这次采用外部中断的方

qq_45784922的博客 6170

箭头函数的this指向和绑定规则

主要是用来改变this的指向,就是说如果创建一个构造函数,我们在里面再加一个函数,它们两个的this指向不同,第一个指向实例的本身,而第二个默认指向window因为箭头函数有一个特性,就是不绑定this,会捕获其定义时所在的this指向作为自己的this...

m0_65792291的博客 241

【操作系统】Hello CTF-专为CTF比赛封装的虚拟机 Beta版

很多师傅在学习与研究CTF的道路上,总是碰到想提升自我水平,但缺少本地化的训练环境以及安装各类软件的烦恼现象;因此拥有一些趁手“武器”,干起活来将会事半功倍。CTFos是探姬(ProbiusOfficial)专为CTF比赛封装的虚拟机,基于工具集封装多个版本和系统。CTF入门选手各行业网络/信息从业人员安全相关工作人员但不想在工作机上安装CTF一些奇葩的软件…该系统是通过虚拟机封装的,需要使用打开!一个专为CTF比赛封装的虚拟机,开箱即用。

qq_47493625的博客 1万+

JS中,this指针的绑定规则和箭头函数的使用

总结了JS中,this指针的绑定规则和箭头函数的使用

LovelyHeart的博客 653

ZYNQ双核通信实战:手把手教你用OpenAMP搭建Linux+FreeRTOS开发环境(2018.3版)

本文详细介绍了如何在ZYNQ平台上使用OpenAMP框架实现双核通信,构建Linux与FreeRTOS协同开发环境。从开发环境配置、系统组件编译到OpenAMP框架应用,手把手指导开发者完成ZYNQ双核通信系统的搭建与调试,为异构计算开发提供实用解决方案。

weixin_33737134的博客 475

ISO15118-20协议测试实战:用Efficient XML库验证26条命令编解码(附完整代码)

本文分享了ISO15118-20协议测试实战经验,重点探讨了使用Efficient XML库对26条命令进行EXI编解码验证的过程。通过搭建测试环境、编写自动化程序并与官方工具链进行交叉比对,文章深入分析了4条命令编码结果不一致的原因,并提供了完整的排查思路与C代码示例,旨在帮助开发者确保电动汽车充电通信的协议一致性。

weixin_29284657的博客 108

this指向终极解决方案(附带手写绑定函数)

this

Proction的博客 321

从GitHub到海浪模拟:手把手教你配置WAVEWATCHⅢ 6.07.0的完整开发与测试环境

本文详细指导如何在Ubuntu系统中配置WAVEWATCHⅢ 6.07.0的开发与测试环境,涵盖虚拟机设置、依赖安装、源码编译及案例验证的全流程。通过步骤化教程,帮助科研人员快速搭建高效的海浪模拟平台,提升海洋数值模拟的研究效率。

weixin_42568801的博客 322

用纯CSS实现的箭头

分类 编程技巧    发布  newghost 3/21/2014   原文  注意 转载须保留原文链接,译文链接,作者译者等信息。  原文链接: 用CSS即可绘制出各种箭头,无需裁剪图片,甚至没有用到CSS3的东西。对浏览器支持良好。 基本原理 原理非常简单,通过截取border(边框)的部分“拐角”实现,几行CSS代码即可理解: 一个梯形 当元素宽、高和边框的宽相近

stepli的专栏 2180

UNet改进(6):基于注意力机制的多尺度医学图像分割方法

本文提出了一种集成多尺度注意力机制的UNet改进模型UNetWithAttention,用于提升医学图像分割性能。该模型在标准UNet架构基础上,设计了并行3×3、5×5、7×7卷积核的多尺度注意力模块,通过特征拼接和Sigmoid激活生成注意力权重,实现了对不同尺寸病变的自适应关注。模型采用分离式设计,将特征提取与特征选择解耦,在编码器-解码器各阶段嵌入注意力模块。实验表明,该方法在视网膜血管分割和肺结节检测任务中优于标准UNet,Dice系数和IOU分别提升2.6%和4.1%,同时保持计算效率。

2501_91516851的博客 1324

用 MVC 框架把 ABAP 报表写成可扩展的应用(2)

本文介绍了一个基于MVC架构的SAP报表模板,解决了传统ABAP报表开发中的三个核心痛点: 选择屏幕校验逻辑分散问题 - 通过统一的选择屏幕控制器集中管理校验逻辑 在线与后台输出不一致问题 - 共享同一数据模型,通过不同控制器实现多样化展示 屏幕流转管理混乱问题 - 主控制器统一管理所有屏幕流程和事件 该模板采用分层架构: Model层专注数据获取和业务规则 Controller层管理流程和交互 View层负责展示逻辑 特别适用于需要同时支持交互式ALV展示和后台批处理输出的报表场景,通过标准化的扩展点设计

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 78

一个属性搞定指向小箭头

transform: rotate(α) 的 应用 1、实现思路 创建一个正方形的块元素 arrow 添加 左侧边框、上侧边框,设置为1px solid red ; 将 arrow 顺时针 旋转 45° 根据 定位,将元素放在另一个元素之上 2、代码实现 <!DOCTYPE html> <html lang="en"> <head> ...

qq_44158936的博客 418

【AI编程】Cursor编程工具使用教程:下载、配置、使用、运行Java项目

【AI编程】Cursor编程工具使用教程:下载、配置、使用、运行Java项目

funfan的博客 5196

前端开发--箭头函数

但是上面的写法是错误的,因为这时大括号被解释为代码块,解决的办法是:在对象外面加上小括号,上面我们写的代码中,发现函数体中只有一条语句,那么这时是可以省略大括号的。通过上面的代码,可以发现在箭头函数中直接使用this是没有问题的。把上面的代码转换成ES5的写法,发现和我们前面写的代码是一样的。通过上面的代码,可以发现传统方式来定义函数的时候,比较麻烦。将上面的代码修改一下,要求延迟1秒钟以后,再输出用户名的名称。在给构造函数添加原型函数时,如果使用箭头函数,其中的。,所以箭头函数中使用的this指的就是。

weixin_51059952的博客 1669

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

前端怎么做指向箭头

步骤一 给div盒子设置宽度,高度,再设置上边框和右边框 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale

weixin_44628177的博客 2063

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

前端指向箭头的设计

css画箭头的方式 指向箭头其实就相当于在div中画一个正方形的div在画一个三角形的div然后将他们拼接起来。 长方形通过调整width和height来调整长方形的大小,而三角形通过border-left和border-right来调整左右 三角形的这是50的时候 这是25的时候 而三角形的顶点是根据border-top:这个值来改变的 .triangle-down { width: 0; height: 0; border-left: 50px solid transp

weixin_46275928的博客 1171

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【转载】前端技术之DIV或SPAN+CSS实现箭头效果技术

为什么80%的码农都做不了架构师?>>> ...

weixin_33910385的博客 675

前端-css,三角箭头的实现

三角箭头的实现方式

tl110110tl的专栏 1608

css arrow box html,前端css如何实现箭头

前端css实现箭头的方法:设置箭头盒子,在div里设置属性即可,代码为【本教程操作环境:windows7系统、css3版,DELL G3电脑。前端css实现箭头的方法:效果图:htm部分:css部分:.arrow_box{width:100px;height:100px;border-radius: 10px;background: rgba(255,0,0,0.5);position: rela...

weixin_34206129的博客 565

自学前端-(css三角制作和箭头制作)

一、三角制作 原理:定义一个盒子,将盒子的宽高为0,将盒子的表框线条变粗,然后将所有的边框设置为透明,而后设置其中一条边为一种颜色,即可完成 border: 10px solid transparent; border-bottom-color: tomato; 高级三角: 原理:定义一个盒子,将盒子的宽高为0,通过修改四个边框的大小,来调整三角形 box1 { width: 0; height: 0; /* 将

DespairA的博客 616

远程电压检测技术:原理、设计与工程实践

电压检测是电力电子系统中的基础技术,通过实时监测负载端电压形成闭环反馈,动态补偿线路压降。其核心原理基于欧姆定律,但需考虑导线电阻温度系数、趋肤效应等实际因素。该技术能显著提升系统稳定性,在工业自动化、精密仪器等场景中尤为重要。以AWG线缆为例,合理选择线规和屏蔽措施可有效降低噪声干扰。工程实践中,远程检测技术不仅能补偿静态压降,还能改善动态响应特性,如某案例显示其将动态响应时间从120ms缩短至8ms。通过双绞屏蔽线和π型滤波器等设计,系统纹波电压可降低83.3%,为电力传输提供精确保障。

weixin_33720956的博客 1123

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 323

React 性能:memo / useMemo / useCallback

讲清 memo/useMemo/useCallback 的配合与边界,先测量再优化,避开常见过早优化。

JudithHuang的博客 316

Claude Code 从入门到实战(一):安装、登录与第一个Vue项目

Claude Code 系列实战第 1 篇:先认识 Claude Code 的工作方式与任务循环,完成 npm 安装、登录与授权,通过让 Claude 理解一个 Vue 项目完成第一次实战任务,并辨析默认、自动接受编辑、Plan 规划等权限模式的差异与选择策略。

weixin_45284808的博客 203

DSH (DeepSeek Harness) Windows 升级安装指南20261107

注意:如果在普通窗口执行 nvm 提示找不到命令,或执行 nvm use 提示 Access is denied,请务必关闭当前窗口,重新打开一个管理员CMD 执行上述完整路径命令。找到 .credentials.yaml,将其重命名为 .credentials.yaml.bak(备份并使其失效)。Node.js Storage Location:可改到非系统盘(如 D:\dev\nvm,避免路径含空格或中文)。打开文件资源管理器,进入 C:\Users<你的用户名>.dsh\。

fengye207161的博客 154

SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在

# SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在 > 这是一套基于 Spring Boot 的服装销售平台源码,配套 `db.sql` 建表脚本,业务覆盖商品展示、购物车、订单流转、收货地址、订单评价、商品评论、在线客服、轮播图和资讯。形态是**前后台双端**:前台是顾客逛的商城,后台是管理员管的控制台。本文带你看清里面有什么、怎么跑

面朝大海 205
上一篇: Spring Aop 底层责任链思路实现
下一篇: 前端资源浏览器渲染原理
冷环渊
博客等级 码龄7年 1130粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷环渊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值