【JavaScript】确定和指定 this 的值

确定 this

在非严格模式下,总是指向一个对象,在严格模式下可以是任意值。

  1. 全局执行环境中,指向全局 window 对象(非严格模式、严格模式)
  2. 函数内部,取决于函数被调用的方式
    1. 直接调用的this值:① 非严格模式:全局对象(window) ② 严格模式:undefined
    2. 对象方法调用的this值:① 调用者
    /*** 如何确认this的值* 1.全局执行环境*   严格模式,非严格模式:全局对象(window)* 2.函数内部*  2.1 直接调用*   严格模式下:undefined*   非严格模式:全局对象(window)*  2.2 对象方法调用*   严格模式,非严格模式:调用者* 3.开启严格模式*   脚本开启: 'use strict'*   函数内部开启:'use strict'*   注意:'use strict'写在代码顶端* */// ------------- 1.全局执行环境 -------------//  严格模式,非严格模式 全局对象(window)// 'use strict'// console.log(this)// ------------- 2.函数内部 -------------// 2.1 直接调用-非严格模式// function func() {//   console.log(this) // window// }// func()// 2.1 直接调用-严格模式// function func() {//   'use strict'//   console.log(this) // undefined// }// func()// 2.2 对象方法调用const food = {name: '猪脚饭',eat() {'use strict'console.log(this)}}// 非严格模式,严格模式food.eat() // 调用者

指定 this

可以通过两种方法指定this:

  1. 调用时指定:
    1. call方法
    2. apply方法
  2. 创建时指定:
    1. bind方法
    2. 箭头函数
    /*** 如何指定this的值:*  1. 调用时指定this:*  2. 创建时指定this:* */// ------------- 1. 调用时指定this: -------------function func(numA, numB) {console.log(this)console.log(numA, numB)}const person = {name: 'username'}// 1.1 call:挨个传入参数// func.call(person, 1, 2)  // this 为 {name: 'username'}// 1.2 apply:以数组的方式传入参数// func.apply(person, [3, 4])  // this 为 {name: 'username'}// ------------- 2. 创建时指定this: -------------// 2.1 bind方法// const bindFunc = func.bind(person, 666)  // this 为 {name: 'username'} ,Func函数的参数可以依次传入// bindFunc(888)  // numA 为 666,numB 为 888// 2.2 箭头函数const food = {name: '西兰花炒蛋',eat() {console.log(this)  // food// 箭头会从自己作用域链的上一层继承thissetTimeout(() => {console.log(this)  // food}, 1000);// setTimeout(function () {//   console.log(this)  // window// }, 1000)}}food.eat()

总结

如何确认this指向:

  1. 全局执行环境中,指向全局对象(非严格模式、严格模式)

  2. 如何开启严格模式:

    // 为整个脚本开启严格模式
    'use strict'
    function func() {// 为函数开启严格模式'use strict'
    }
    
  3. 函数内部,取决于函数被调用的方式

    1. 直接调用的this值:
      1. 非严格模式:全局对象(window)
      2. 严格模式:undefined
    2. 对象方法调用时的this值为调用者

如何改变this指向,有2类改变this指向的方法,分别是:

  1. 调用函数时并传入具体的this
    1. call:从第二个参数开始挨个传递参数
    2. apply:在第二个参数以数组的形式传递参数
  2. 创建函数时绑定this?
    1. bind:返回一个绑定了this以及参数(可选)的新函数
    2. 箭头函数:创建时会绑定上一级作用域中的this

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

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

相关文章

SAC(Soft Actor-Critic)理论与代码解释

标题 理论序言基础Q值与V值算法区别 SAC概念Q函数与V函数最大化熵强化学习(Maximum Entropy Reinforcement Learning, MERL)算法流程1个actor,4个Q Critic1个actor,2个V Critic,2个Q Critic 代码详解Actor网络理论中的…

使用nslookup命令查询域名系统的信息

文章目录 前言常规使用再从linux环境下学点不一样的type选项retry选项timeout选项 使用更强大的dig命令总结 前言 这个命令出现在与运维同学沟通过程中,在此之前要是问我一个域名对应的服务器是IP地址是什么,我肯定优先想到的是 ping 这个命令&#xff…

Opencv——霍夫变换

霍夫直线变换 霍夫直线变换(Hough Line Transform)用来做直线检测 为了加升大家对霍夫直线的理解,我在左图左上角大了一个点,然后在右图中绘制出来经过这点可能的所有直线 绘制经过某点的所有直线的示例代码如下,这个代码可以直接拷贝运行 import cv2 as cv import matplot…

STL---stack 和 queue 容器适配器

【有道云笔记】STL---stack 和 queue 容器适配器 https://note.youdao.com/s/ERx1b1Af

Jmeter学习系列之四:测试计划元素介绍

测试计划元素 JMeter包含各种相互关联但为不同目的而设计的元素。在开始使用JMeter之前,最好先了解一下JMeter的一些主要元素。 注意:测试计划包含至少一个线程组。 以下是JMeter的一些主要组件: 测试计划(Plan)线程组(Thread Group)控制器(Controllers)监听器(Listeners)计…

基于JavaWeb开发的服装网上商城系统【附源码】

基于JavaWeb开发的服装网上商城系统【附源码】 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统 &#…

如何优化博客的内容和用户体验

在当今数字时代,博客成为了分享知识、展示个人专业能力和吸引读者的重要工具。然而,随着越来越多的博客涌现,如何优化博客的内容和用户体验成为了一个关键的问题。本文将为你提供一些有效的技巧,帮助你优化博客的内容和提升用户体…

Phoncent博客,探索Rie Kudan的GPT创作之举

近日,大家都在谈论日本作家Rie Kudan,她凭借其小说《东京共鸣塔》("Tokyo-to Dojo-to")荣获了日本极具声望的芥川奖。这本小说引起了广泛的讨论和思考,因为令人惊讶的是,Kudan在其中直接引用了人…

VUE3 加载自定义SVG文件

网上代码通篇一律,需要修改多处地方,特别是component下还要创建一个index.vue的组件,奇奇怪怪。 要在 Vue 项目中使用 svg-sprite-loader 来管理 SVG 图标,你需要执行以下几个步骤: npm install svg-sprite-loader -…

报告发布 | 聚铭网络参编的《数据安全风险评估实务:问题剖析与解决思路》正式发布

近日,由中国信通院、中国通信标准化协会主办,中国通信标准化协会大数据技术标准推进委员会承办的“数据资产管理大会数据安全论坛”在北京成功召开。会上正式发布了《数据安全风险评估实务:问题剖析与解决思路》报告(以下简称“报…

事务、MVCC、锁

目录 事务MVCC锁 事务 四大特性:ACID 脏读:事务A读取到未提交事务B修改的数据 不可重复读:事务A修改了未提交事务B读取的数据 幻读:事务A增删了未提交事务B读取的数据 不可重复读与幻读都是读取的结果不同,前者侧重于…

AI 平台汇总

chatexcel https://chatexcel.com/convert chatlaw https://www.chatlaw.cloud/

什么是零知识证明?

Web3 的核心原则之一——透明度,也可能是其最大的缺点之一。没有人希望他们的所有在线活动(从金融交易到个人身份数据)都可供任何人公开查看。为了使区块链能够扩展并变得更容易访问,隐私必须成为首要任务。 零知识证明能够改变我…

一些著名的软件都用什么语言编写?

1、操作系统 Microsoft Windows :汇编 -> C -> C 备注:曾经在智能手机的操作系统(Windows Mobile)考虑掺点C#写的程序,比如软键盘,结果因为写出来的程序太慢,实在无法和别的模块合并&…

2001-2022年全国30省就业人数数据

2001-2022年全国30省就业人数数据 1、时间:2001-2022年 2、来源:各省年鉴、人口和就业年鉴、wind 3、指标:省份、年份、就业人数 4、范围:30个省市 5、缺失情况:无缺失 6、指标解释: 就业人口是指一…

[嵌入式软件][入门篇][仿真平台] STM32CubeMX的搭建

文章目录 一、简介二、STM32CubeMX的使用(1) 新建文件,芯片选型(2) sys设置和RCC设置(3) 配置时钟(4) 生成代码 三、仿真平台的使用 一、简介 STM32CubeMX是一种图形工具,通过分步过程可以非常轻松地配置STM32微控制器和微处理器,生成相应的初…

保护医疗数据不受威胁:MPLS专线在医疗网络安全中的角色

随着数字技术的快速发展,医疗行业正在经历一场革命。从电子健康记录到远程医疗服务,数字化不仅提高了效率,也带来了前所未有的挑战--尤其是关于数据安全和隐私保护的挑战。在这样的背景下,如何确保敏感的医疗数据安全传输&#xf…

第一口就喝到了珠珠

x*ay*bc;假设b杯比a杯大,那么就是往b中可以加入a杯,然后倒出b杯,就是求x和y的最大公因数,用cn1*k*xn2*k*ygcd(a,b)*(n1*xn2*y);而且c要小于a或者b的最大值. int gcd(int a, int b) {while (b) {int t b;b a % b;a t;}return s…

腾讯云Linux(OpenCloudOS)安装tomcat9(9.0.85)

腾讯云Linux(OpenCloudOS)安装tomcat9 下载并上传 tomcat官网 https://tomcat.apache.org/download-90.cgi 下载完成后上传至自己想要放置的目录下 解压文件 输入tar -xzvf apache-tomcat-9.0.85.tar.gz解压文件,建议将解压后的文件重新命名为tomcat,方便后期进…

logstash的使用

背景:想要通过logstash将以txt结尾的文件数据导入到es中,这种TXT文件每天都会生成,然后将增量的TXT文件加载到es中,之前没用过,做个记录 ES中的表结构如下 {"user_name" : {"aliases" : { },&qu…