JavaScript this对象

this关键字时是函数运行时自动生成的一个内部对象,只能在函数内部使用,总指向调用它的对象

绑定规则

默认绑定

全局环境中定义函数,内部使用this关键字

var name = 'Jenny';
function person() {return this.name;
}
console.log(person());  //Jenny

上述调用函数的对象在浏览器中为window,所以this指向window,输出Jenny

隐式绑定

函数可以作为某个对象的方法来调用,此时this就指向这个上级对象

function test() {console.log(this.x);
}
​
var obj = {};
obj.x = 1;
obj.m = test;
​
obj.m(); // 1

一个函数中包含多个对象,尽管函数是被最外层的对象调用,this指向的也只是上一级的对象

var o = {a:10,b:{fn:function(){console.log(this.a); //undefined}}
}
o.b.fn();

上述代码中this指向的仍旧是b,b作用域内没有a的定义,所以打印undefined

记住,this指向的是最后调用它的对象

new绑定

通过构造函数new关键字生成一个实例对象,this指向该实例对象

function test() {this.x = 1;
}
​
var obj = new test();
obj.x // 1

不过也有特殊情况

当构造函数返回一个简单类型,this仍指向实例对象

但当构造函数返回一个对象时,this指向会改变成返回的对象,如下:

function fn()  
{  this.user = 'xxx';  return {};  
}
var a = new fn();  
console.log(a.user); //undefined

手写一个new关键字

function mynew(Func, ...args) {// 1.创建一个新对象const obj = {}// 2.新对象原型指向构造函数原型对象obj.__proto__ = Func.prototype// 3.将构建函数的this指向新对象let result = Func.apply(obj, args)// 4.根据返回值判断return result instanceof Object ? result : obj
}

显示修改

apply()、call()、bind()是函数的方法,作用时改变函数的调用对象,之前已经讲过,apply,call都是临时一次改变,而bind则是返回一个新的函数,指向为传进来的参数。

具体见下方文章链接:

箭头函数

箭头函数在定义时就已经确定了this的指向,且不能通过显示修改的方式改变其this指向

const button = document.getElementById('mngb');
button.addEventListener('click', ()=> {console.log(this === window) // truethis.innerHTML = 'clicked button'
})

如上,该箭头函数被定义时处于全局作用域中,所以this指向window

最后说一下绑定优先级,

new绑定优先级 > 显示绑定优先级 > 隐式绑定优先级 > 默认绑定优先级

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

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

相关文章

C++项目--高并发内存池

目录 一、项目介绍二、内存池介绍2.1 池化技术2.2 内存池2.3 内存池主要解决的问题2.4 malloc 三、定长内存池的实现3.1 定长内存池概念3.2 内存池管理释放对象3.3 内存池申请对象3.4 定长内存池整体代码3.5 性能对比 四、高并发内存池整体框架设计4.1 该项目解决的问题4.2 整体…

C语言贪吃蛇实现,以及一些有趣的想法(可加速减速)

文章目录 每日一言代码:Snake.hSnake.ctest.c 可以增加游戏趣味性的想法结语 每日一言 结局每隔一段时间就会到来,我经历它,就像飞机穿过云层。 跟着课程敲了一下午,终于写好了~ 用到了一些没用过的函数,总结介绍一下…

【Linux的网络编程】

1、OSI的七层网络模型有哪些,每一层有什么作用? 答:(1)应用层:负责处理不同应用程序之间的通信,需要满足提供的协议,确保数据发送方和接收方的正确。 (2)表…

【力扣100】70.爬楼梯 || python中的@cache || 装饰器

添加链接描述 思路: 最后一节楼梯的方式来自倒数第二节和倒数第三节的方法所以使用递归来做,定义递归出口n分别为1,2时候的方法种数:1种和2种类似于斐波那契数列超时了 优化: 5. 因为每次递归都要从n算到n为1和2的时候&#xff0…

安卓Java面试题 1-10

🔥 1、简述Android的4大组件是哪些,它们的作用?🔥 Android的4大组件 1:Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态…

Pytorch学习 day06(torchvision中的datasets、dataloader)

torchvision的datasets 使用torchvision提供的数据集API,比较方便,如果在pycharm中下载很慢,可以URL链接到迅雷中进行下载(有些URL链接在源码里)代码如下: import torchvision # 导入 torchvision 库 # …

VM 虚拟机 ubuntu 解决无法连接网络问题

添加网卡法 就是在虚拟机的设置那里多增加一个网卡

如何度量关键成果KR的完成情况?

明确度量指标 首先,需要为每一个关键成果(Key Result)设定明确的度量指标。这些指标应该是具体、可衡量的,以便能够清晰地反映关键成果的完成情况。例如,如果关键成果是提高网站的用户转化率,那么度量指标…

NOIP 2016普及组初赛试题及解析

NOIP 2016普及组初赛试题及解析 一. 单项选择题 (共20题,每题1.5分,共计30分。每题有且仅有一个正确答案.)。二. 问题求解(共2题,每题5分,共计10分)三. 阅读程序写结果(共4题,每题8分,共计32分)四. 完善程序 (前4空,每空2.5分,后6空,每空3分,共28分)一. 单项选…

论文阅读_解释大模型_语言模型表示空间和时间

英文名称: LANGUAGE MODELS REPRESENT SPACE AND TIME 中文名称: 语言模型表示空间和时间 链接: https://www.science.org/doi/full/10.1126/science.357.6358.1344 https://arxiv.org/abs/2310.02207 作者: Wes Gurnee & Max Tegmark 机构: 麻省理工学院 日期: 2023-10-03…

Linux设备模型(八) - sysfs

一,sysfs目录介绍 sysfs是一个基于内存的虚拟的文件系统,有kernel提供,挂载到/sys目录下,负责以设备树的形式向user space提供直观的设备和驱动信息。 sysfs以不同的视角展示当前系统接入的设备: /sys/block 历史遗…

滑动窗口算法

前言 滑动窗口作为一个考点较高的算法,广泛应用于子串问题中,本文将进行详细讲解。 一、滑动窗口是什么 滑动窗口是双指针算法的一种,基本思路为维护一个窗口,然后从前往后遍历元素进行运算。 二、滑动窗口算法和其他双指针算法…

Unity Samples和帧动画的问题

拖动序列帧图片和自己创建clip的帧率不同 我今天在创建帧动画的时候用了两种方式第一种是直接拖动序列帧图片到Hierachy,然后生成的第二种是这样我发现两者播放的动画速率不一样最后查了半天查不到原因。最后发现是Samples的原因,而且Unity把Samples这个…

分类预测 | Matlab基于GWO-RBF灰狼算法优化径向基神经网络的分类预测

分类预测 | Matlab基于GWO-RBF灰狼算法优化径向基神经网络的分类预测 目录 分类预测 | Matlab基于GWO-RBF灰狼算法优化径向基神经网络的分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 Matlab基于GWO-RBF灰狼算法优化径向基神经网络的分类预测。基于灰狼算法(GWO…

记一次Flink任务无限期INITIALIZING排查过程

1.前言 环境:Flink-1.16.1,部署模式:Flink On YARN,现象:Flink程序能正常提交到 YARN,Job状态是 RUNNING,而 Task状态一直处于 INITIALIZING,如下图: 通过界面可以看到…

小火星露谷模组管理页面简介

1. 已有详细介绍的功能 模组管理页面部分功能已经有较为详细的介绍: 添加模组:https://svmbbs.smallfire.cn/d/15-dian-nao-zhong-yi-jing-you-duo-ge-mo-zu-ya-suo-wen-jian-ru-he-pi-liang-an-zhuang一键更新模组:https://svmbbs.smallfi…

python基础——入门必备知识

📝前言: 本文为专栏python入门基础的第一篇,主要带大家先初步学习一下python中的一些基本知识,认识,了解一下python中的一些专有名词,为日后的学习打下良好的基础,。本文主要讲解以下的python中的基本语法&…

苹果发布iOS17.4正式版升级,罕见带来一大波新功能!苹果数据备份软件 iOS系统管理软件 苹果数据备份到icloud iOS系统数据处理

近日,苹果发布了iOS17.4正式版,没想到的是居然有一大波新功能,如果你也是用iPhone的话,尤其是iPhone15新系列的,那么推荐你一定要升级下。下面让我给大家详细讲讲: 「电池健康」升级 电池设置界面得到了优…

LightDB支持 no_expand hint【24.1】【oracle兼容】

LightDB 从 24.1 开始支持 oracle no_expand hint。 no_expand hint 用于取消OR-expansion优化,不进行OR-expansion优化。 OR-expansion 在 Oracle 中 优化器会基于cost 优化带析取的查询块(OR), 会拆分这个查询块为多个查询块,…

项目快速搭建脚手架

1.单体项目 5分钟搭建一个Spring Boot 前后端分离系统-Ballcat Ballcat 也会为每个版本的升级改动列出详细的更新日志,以及增量 SQL。 Github 地址 :https://github.com/ballcat-projects/ballcat Gitee 地址:https://gitee.com/ballcat-pro…