[JS]大话this指针

【Bug—eNSP】华为eNsp路由器设备启动一直是0解决方案! 软件,添加AR设备时启动异常,最开始错误代码是40,最后通过重新安装,又出现了新的问题,启动AR设备一直是0,而且界面卡住。打开控制面板→网络和Internet→网络和共享中心→更改适配器设置,然后再按以下步骤一次操作。重新打开eNsp,然后选择注册设备,注册成功后重新启动一下,这个时候AR设备就可以正常启动啦。打开eNsp→菜单→工具→选项→服务器设置,写入刚刚写的IP地址就可以了。打开VirtualBox,将左侧的文件全部删除(点击删除所有文件) 阅读详情

5分钟快速掌握版

在刚开始学习JavaScript的时候,经常被js中的this及其相关的方法,例如:bind,apply,call方法迷惑。其实我们只要根据包含this指针的方法的用途加以区分,就能了解this指针所指向的对象:

1、直接函数调用,this指针指向全局环境,即Window对象,例如

2、对象函数调用,this指针指向调用函数的对象本身,例如:

var object={
    'name':"vicky",
    'sayName':function(){ console.log(this.name)}
};
object.sayName();   //this指针指向object对象,因此输出vicky

3、构造函数调用,this指针指向新创建的对象,例如:

function object(name){
    this.name=name;
    console.log(this);      //由于this指向新创建的对象本身,输出:Object { name: "vikcy" }
    console.log(this.name);  //输出:"vicky"
}
var myObject=new Object('vicky');  //由于this指向新创建的对象本身

4、间接函数调用,例如call、apply方法,还有个特殊的bind方法

详细分析this指针

1、直接函数调用

this指针指向全局环境,即Window对象

在全局环境中直接调用函数时,this对象会指向Window对象,例如:

var name='vicky'
function sayName(name){
    console.log(this.name);
}
sayName();   //this指向window对象,而因为在全局环境中定义了var name='vicky';所以this.name输出:vicky
window.sayName();  //sayName()效果等同于window.sayName()
2、对象函数调用

this指针指向调用函数的对象本身

var name='Bob';
function sayName(){
    console.log(this.name);
}
var object={'name':'vicky'};
object.sayName=sayName;          //sayName没有写成sayName(),表示不是执行函数,而是将sayName的指针赋值给object.sayName
object.sayName();               //由于对象函数调用方法,this指向对象本身,所以输出:'vicky'
sayName();                     //由于全局环境调用sayName()等同于window.sayName();输出:'Bob'

上面的例子已经很好的说明了在全局环境直接调函数调用和对象函数调用时this指针指向的区别。

3、构造函数调用

this指针指向新创建的对象

function object(name){
    this.name=name;
    console.log(this);      //由于this指向新创建的对象本身,输出:Object { name: "vikcy" }
    console.log(this.name);  //输出:"vicky"
}
var myObject=new Object('vicky');  //由于this指向新创建的对象本身

开篇的例子已经很好的说明了构造函数调用的时候,this指针指向新创建对象的本身。

拓展new关键词(可跳过)

但在这里我想拓展一下知识,想跟大家聊聊为什么构造函数调用的时候,this指针为什么指向创建对象的本身,new关键字到底做了什么?

其实在通过new关键词去调用构造函数创建对象的时候,经历了如下的过程:

1、创建新对象,继承构造函数的prototype

2、调用call()方法,接受参数并修改this的指向,指向这个新对象

3、执行构造函数,如果构造函数有返回对象,则这个对象会取代步骤1创建的新对象,如果构造函数没有返回值,则返回步骤1创建的对象。

如果用代码模拟这个过程,可以大致参考:

var newObject=function(func){
    var o={};  //创建一个新对象
    o.__proto__=func.prototype;  //继承构造函数prototype
    var k=func.call(o);         //调用call方法,修改this指向,指向这个新创建的对象
    if(typeof k=== 'object'){
        //如果构造函数有返回对象,则取代步骤1创建的对象,返回构造函数所返回的对象
        return k;
    }else{
        //如果构造函数没有返回对象,则直接返回步骤1创建的对象
        return o;
    }
}

这段模拟的代码有一点缺陷,缺陷就是call方法的时候没有模拟接受参数的步骤,不过不影响我们对new关键词的理解。

现在我们通过实例,来理解下上面的new关键词运作:

function Dog(name){
    this.name=name;
    console.log(this.name);    //输出'泰迪'
    console.log(this);        //输出:Object { name: "泰迪" }
}
Dog.prototype.sayName=function sayName(){
console.log("my name is "+this.name);
}
var animal=new Dog("泰迪");
animal.sayName();       //输出:'my name is 泰迪'

上面的这段代码,已经能够证实了以下几点:

1、构造函数this指针指向新创建的对象

2、创建新对象,继承构造函数的prototype

3、调用call()方法,接受参数并修改this的指向,指向这个新对象

对于

执行构造函数,如果构造函数有返回对象,则这个对象会取代步骤1创建的新对象,如果构造函数没有返回值,则返回步骤1创建的对象。

这一点,我们在看下下面这个实例:

function Cat(){
    console.log(this);   //输出:Object {  }
    console.log("cat"); 
}
function Dog(name){
    this.name=name;
    console.log(this.name);
    console.log(this);    //输出:Object { name: "泰迪" }
    return new Cat();    //关键代码,在构造函数返回了一个对象
}
var animal=new Dog("泰迪");   //输出:Object {  }

这段代码我们可以证实:

执行构造函数,如果构造函数有返回对象,则这个对象会取代步骤1创建的新对象,如果构造函数没有返回值,则返回步骤1创建的对象。

这一点,我们在Dog的构造函数最后返回了一个Cat的对象,所以animal指针指向的是构造函数中返回的new Cat()的对象实例。

4、间接函数调用,例如call、apply方法,还有个特殊的bind方法
call(this指针要指向的对象,参数1,参数2,…..)

call方法可以动态的设置函数体内的this指向,例如:

function Cat(age,name){
    this.name='cat';
    console.log(this);
    console.log('cat: age:'+age+",name:"+name);
}
var cat=new Cat(4,'Bob');    //输出:Cat {name: "cat"}和cat: age:4,name:Bob
Cat.call(this,3,'Tom');     //由于调用了call方法,输出:this指向了Window和cat: age:3,name:Tom

先看var cat=new Cat(4,'Bob');这行代码,这里的this指向的是新建的Cat对象,输出的“cat: age:4,name:Bob”也是在对象初始化时候传入的。Cat.call(this,3,'Tom');这行代码,这里的this指向的是Window对象,因为:我们在全局环境调用了Cat.call(this,3,'Tom');方法,这里call函数第一个参数(this指针要指向的对象)我们传入了this,而全局环境下的this指向的正好就是window对象,而第三和第四个参数,我们分别定义了age=>3,name=>’Tom’

apply(this指针要指向的对象,参数数组或arguments对象)

apply方法和call方法的作用相同,唯一不同的是call方法要将参数一一传入,而apply方法传入的是数组或者arguments对象。arguments对象包含了函数的所有参数。

实例:

function Cat(age,name){
    this.name='cat';
    console.log(this);
    console.log('cat: age:'+age+",name:"+name);
}
var cat=new Cat(4,'Bob');    //输出:Cat {name: "cat"}和cat: age:4,name:Bob
Cat.apply(this,[3,'Tom']);     //由于调用了apply方法,输出:this指向了Window和cat: age:3,name:Tom
function getCat(age,name){
    Cat.apply(this, arguments);    //arguments包含了函数的参数
}
getCat(5,"kitty");           //由于调用了apply方法,输出:this指向了Window和cat: age:5,name:kitty
bind(this指针要指向的对象)

bind这个方法会创建一个函数的实例,其 this 值会被绑定到传给 bind()函数的值。

window.color = "red"; 
var o = { color: "blue" }; 
function sayColor(){ 
    console.log(this.color); 

} 
var objectSayColor = sayColor.bind(o); 
objectSayColor(); //由于调用了 sayColor.bind(o),bind函数返回的函数实例中的this直接绑定了o这个对象,
                    所以即使在全局环境调用函数objectSayColor,也会输出:"blue"
window.objectSayColor();   //输出:"blue"

最后复盘:

所以要了解this指向时,我们应该先弄清楚函数调用的方式,最后问自己这个this指向的对象是从何而来。

我是大麦,如果喜欢我的文章,请点个赞。

CT探测器普遍采用“星形拓扑+多ADC模组”架构的TDC(时间数字转换器)设计方案 本文提出一种基于TDC反馈机制的CT探测器时钟同步方法,通过延时测量、偏差计算和动态补偿三步硬件流水线,实现高精度同步。系统采用Xilinx Kintex UltraScale FPGA内置CARRY8进位链构建3.5ps分辨率的TDC,结合多级比较器和延迟单元,形成闭环反馈控制。实验表明,在512通道、1.28m传输距离下,同步精度稳定在10ps以内,较传统方案提升两个数量级,并能动态补偿干扰抖动。该方案解决了传统方法在CT旋转腔体环境下精度不足的问题,为下一代超高清CT提供了有效的时钟同步解决方案。 阅读详情

相关推荐

AUTO-DL平台快速部署BEVFormer:Nuscenes数据集完整训练避坑指南

本文详细介绍了在AUTO-DL平台高效部署BEVFormer模型并利用Nuscenes数据集进行完整训练的实战指南。重点解析了平台数据管理、环境配置、数据集迁移解压、预处理及训练启动等全流程中的关键步骤与常见避坑技巧,帮助研究者和工程师快速复现这一前沿视觉感知模型,节省云端训练时间与成本。

weixin_29188043的博客 331

手撕内置new / 手写内置new

/*进阶: 重写内置NEW*/ function Dog(name) { this.namer = name; } Dog.prototype.bark = function() { console.log('wangwang'); } Dog.prototype.sayName = function() { console.log('my name is ' + this.name); } /* .

m0_61437615的博客 195

nature子刊:MCNN基于电池故障诊断的模型约束的深度学习方法

本研究提出了一种基于模型约束神经网络(MCNN)的锂离子电池在线故障诊断方法,整合物理模型与深度学习,有效解决了随机工况下传统方法诊断精度低、依赖故障样本等问题。通过统计修正电池包模型和双向LSTM网络,实现了电池状态的高精度预测(平均RMSE 3.9%),并设计模型耦合自动编码器提取可解释特征。在包含18.2百万条真实车辆数据的验证中,该方法故障检测TPR在FPR=0.1时达85%,较基准方法提升超46.5%,且能提前30分钟预警内部短路等故障。研究还展示了算法在跨电池包结构迁移中的优越性,为工业应用提供

hasakie的博客 1758

doajaxfileupload.php,ajaxFileUpload插件

关键词:$.ajaxFileUpLoad();datastatusdataType参考资料:http://www.cnblogs.com/kissdodog/archive/2012/12/15/2819025.html第一步:先引入jQuery与ajaxFileUpload插件。注意先后顺序,这个不用说了,所有的插件都是这样。第二步:HTML代码:第三步:JS代码$(function () {$...

weixin_42357054的博客 192

国内外主流嵌入式GUI汇总

随着MCU资源增多,处理能力也强了,同时市场需求也增多了GUI功能也越来越丰富了,很多的嵌入式图形库都可以做出绚丽的界面。

m0_69914734的博客 3290

ANSYS APDL实战:手把手教你搞定电磁-热耦合分析(附完整命令流)

本文通过一个工业感应加热线圈的实战案例,手把手教你使用ANSYS APDL完成电磁-热耦合分析。内容涵盖从几何建模、材料定义、网格划分到加载求解及后处理的完整流程,重点讲解了使用PLANE13单元进行双向耦合场分析的方法与命令流调试技巧,助力工程师快速掌握这一核心仿真能力。

weixin_29284201的博客 427

数据结构核心概念与工程实践指南:从数组、链表到哈希表与树的应用

数据结构是计算机科学中数据的组织、管理和存储方式,它定义了数据元素间的逻辑关系及可执行操作。其核心原理在于通过抽象数据类型(ADT)描述行为,再以数组、链表等具体实现来优化访问效率。掌握数据结构的技术价值在于提升程序性能,例如哈希表可实现O(1)时间复杂度的快速查找,而平衡二叉树如红黑树能确保操作稳定在O(log n)。在应用场景上,栈用于函数调用与括号匹配,队列适用于任务调度,图能建模社交网络。本文结合Neso Academy的清晰讲解,系统梳理了从线性结构到非线性结构的知识脉络,并提供了Python、J

weixin_34161083的博客 334

【STM32 Blue Pill编程】-STM32CubeIDE开发环境搭建与点亮LED

本文为使用 STM32Cube IDE 的 STM32 Blue Pill 入门教程。 在本文中,我们将介绍如何控制 STM32 Blue Pill 的 GPIO 引脚。以及开发环境搭建。 本系列文章将重点介绍采用 ARM Cortex-M 的 BluepellSTM32F103C8 微控制器以及如何使用 STM32CubeIDE 对其进行编程。 STM32CubeIDE是STM32官网提供的IDE

视觉与物联智能 1067

d3.js v4实现关系拓扑图

前言:因为最近公司业务需求,需要在App中实现关系拓扑图。由于自己之前学习了下Vue.js和一些前端知识和ThinkPHP。就自告奋勇把任务接下来了。后来才发现真的是too young too simple,后端数据接口和Android部分都还好说,但这个拓扑图真是让我欲哭无泪,后来了解了Vis.js和百度出品的echart,也都尝试着去实现自己想要的功能。却都因为可定制化差强人意,不能满足我的强

VickyWinner的博客 2万+

手把手教你学simulink(69.3)--毫米波5G/6G 系统场景实例设计并实现基于Simulink的毫米波多用户MIMO通信系统模型

毫米波频段(30 GHz到300 GHz)因其高带宽和高速率特性,成为5G和未来6G通信系统的理想选择。然而,毫米波信号的传播特性较差,容易受到大气吸收、雨衰、建筑物遮挡等因素的影响。为了克服这些挑战并提高通信容量,多用户MIMO(MU-MIMO, Multi-User Multiple-Input Multiple-Output)技术被广泛应用。多用户MIMO技术通过在基站和多个用户之间同时传输多个数据流,充分利用空间资源,从而显著提升系统容量和频谱效率。

MHD0815的博客 493

【OAG vs RAG】RAG的“语义崩溃“:为什么你的知识库越大,AI越笨?_语义检索oag-优快云博客

19.9 元(AI 编程 / Agent 实战 | 本文同主题系统课程)·49.9 元(AI 时代成长方法论)。单篇不过瘾?订阅解锁全量源码、实战与答疑;文末附资料包领取方式 ↓图1:RAG语义崩溃概念图。

求知若渴、虚心若愚 73

原生JS创建Ajax

function ajax(url ,data,type,success,error){ //兼容IE6,IE5,如果XMLHttpRequest为空,则new ActiveXObject var xhr=XMLHttpRequest?new XMLHttpRequest():new ActiveXObject('Microsoft.XMLHTTP'

VickyWinner的博客 615

802.11be 的“上帝视角”:深入解析 CSI 技术原理与实现

IEEE 802.11be标准下的CSI技术解析 摘要:本文深入解析了802.11be标准中的信道状态信息(CSI)技术。CSI作为无线通信的"高精度地图",通过显式反馈机制获取信道矩阵H,经SVD分解得到预编码矩阵V。802.11be在CSI反馈机制上实现重大改进:支持320MHz带宽、16空间流;引入灵活的子载波分组(Ng=4/16)、更高量化精度(最高9/7比特)、部分带宽反馈和触发式反馈。这些创新显著提升了MU-MIMO和波束成形性能,为Wi-Fi 7带来极速通信、精准感知和Me

1042484520@qq.com(邮箱) 209

Vuex入门教程

前言 组件化应用构建是Vue的特点之一,因此我们在Vue的实际开发过程中会经常需要封装自定义组件,以提高开发的效率。 而组件在大部分情况下并不会孤立的存在,它必然会与父组件和兄弟组件产生数据的交互。所以在这里为大家总结两种组件数据交互的方式:EventBus和利用Vuex框架进行状态管理。 上一篇文章介绍了如果通过EventBus在Vue自定义组件中进行事件传递(Vue自定义组件...

VickyWinner的博客 491

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

[JS]JavaScript一张图引发的深思

很早以前在掘金沸点看到一张图,很有意思就发了朋友圈。结果很多朋友问我为什么。 (好吧,其实我只是不知道这周写什么内容了)。 就围绕这张图,我们扒扒JavaScript的基本数据类型和引用数据类型、栈内存和堆内存、==和===的区别。 为什么! 因为var a和var b是引用类型,它们在栈内存中存放地址指针,在堆内存中存放值;而var c是JavaScript的基本...

VickyWinner的博客 421

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

[JS]大话执行环境和作用域链

十分钟快速掌握版 在学习JS的过程中,我们经常会碰到一个概念就是JS的执行环境、作用域链。 今天我们用十分钟的时间,彻彻底底搞懂JS的执行环境、作用域链的概念。 JS执行环境 JS的执行环境分为两种: 1、全局环境 2、局部环境 全局环境 全局环境是最外围的执行环境,在Web浏览器中,全局环境被认为就是我们众所周知的window对象。因此所有的全局变量和函数都挂载在wind...

VickyWinner的博客 358

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

[JS]闭包就是这么简单

十分钟掌握版 什么是闭包 闭包是指有权访问另一个函数作用域中的变量的函数 这句话怎么理解?别急。我们先看一个例子: function fun(){ //函数内部定义了一个函数变量 var privateVal="private value"; } console.log(privateVal); //报错:privateVal is not define...

VickyWinner的博客 334

Jackson 序列化 / 反序列化注解 完整版笔记

Jackson 序列化 / 反序列化注解 完整版笔记

handsome_sai的博客 274

【项目推荐】基于 SpringBoot3 + Spring AI 的游泳馆管理系统:Agent + RAG + Function Calling 一次学全

它不是玩具 Demo,而是一个「业务 + AI」双主线交织的真实系统——预约业务在跑,AI 客服在旁边实时查库作答,两条线通过 Function Calling、RAG、站内消息串成一体。面试官问「你做过什么 AI 项目」时,你能从业务场景讲到架构取舍,从 RAG 切分参数讲到降级兜底——这和「我调了一下 ChatGPT 的 API」是完全不同的两个段位。项目已包含完整的建表 SQL、初始化数据、部署文档,克隆下来就能跑。获取方式:见文末说明 / 后台回复关键词获取。—— 完 ——

深耕开发,专注编程实战。分享源码解析、项目搭建、问题排查笔记,沉淀技术,持续更新。 347

Web 版翻译者资料库

本项目是桌面版《翻译者资料库》的 Web 移植版,基于 Spring Boot 3.3、Thymeleaf、Bootstrap 5.3 与 MySQL 8.0 构建。它面向翻译写作提供资料、词汇、句库、文本工具、对照制作、查找、备份恢复及旧库迁移等功能,完整继承桌面版核心业务规则,支持一键启动与离线访问。

howard2005的专栏 140

MCP 协议会成为前端 AI 工程的标准接口吗?

MCP(Model Context Protocol)正在成为连接 AI 模型与外部工具、数据源的一层通用协议。本文从 MCP 的核心机制出发,分析它在浏览器与前端工程中的落地边界,讨论它能否成为前端 AI 工程的标准接口,并给出当下更务实的架构选择建议。

m0_62937412的博客 342

LangGraph 本地 build 频频翻车,最终在服务器跑通流式对话

先说结论:我本地那个,一次都没成功过。三次,三次,全挂在拉镜像上。而顺得像刚上过油。这就很像我高中那辆自行车:骑着能走,一上锁就坏。那天晚上我盯着终端里那行红字看了很久,想的不是技术方案,想的是——为什么同一个工具,可以一边让我觉得自己很行,一边让我觉得自己不太行。

人工智能AI技术 110

海外平台频繁弹验证?从 DNS、WebRTC 到浏览器指纹的环境异常排查清单

在运营多地区海外平台账号时,即使代理节点通畅、TCP 握手成功,仍可能遇到频繁人机验证、地区限制、播放失败等异常。核心结论是:这类问题往往不在网络传输层,而在浏览器环境参数与网络出口之间的逻辑自洽性。本文从 DNS 泄漏、WebRTC 穿透、时区与语言匹配、Canvas/WebGL 指纹、TLS 特征五个维度,给出一份可复现的环境异常排查清单,并对比个人手动配置与工程化环境管理方案的适用边界。适用于跨境运营、多账号运维团队。

P1Browser【p1指纹浏览器】的博客 183

信号链电路怎么选运放?奥特四款信号链运放解析【选型参考】

在模拟电路设计中,运放作为信号链的“第一道门槛”,其微小误差往往决定了整个系统的成败。

naNa_1120的博客 191

智能问诊的流程

本文介绍基于FastAPI构建的医疗多Agent系统MediAgent,通过症状分析、诊断推理与治疗建议等模块协同,实现从问诊到报告生成的完整工作流。系统采用前后端分离架构,结合MySQL、RabbitMQ与Docker实现工程化部署,支持异步化验结果接入。虽当前状态暂存于内存,但已具备可扩展性,未来可通过Redis持久化、消息队列联动及医疗安全机制完善,应用于慢病管理、辅助决策等场景,推动AI在医疗流程中的落地应用。

Joey 的工作空间~ 773

流式输出 SSE:实现 AI 对话打字机效果后端开发

摘要解决传统 HTTP 请求在 LLM 长文本生成时导致的客户端长时间阻塞与 TTFT 极高的问题。适用于需为 AI 应用提供打字机效果、优化交互体验的后端开发工程师。读完可获得基于 FastAPI 与 SSE(Server-Sent Events)技术的流式响应实现代码、协议规范及生产环境避坑指南。关键词SSE、流式输出、FastAPI、打字机效果、TTFT、大模型推理背景与问题大模型(LLM)生成完整回复通常耗时数秒至数十秒,传统请求-响应模型导致用户界面长时间无响应,体验极差。

2402_85729970的博客 182
上一篇: [JS]大话执行环境和作用域链
下一篇: [JS]JavaScript一张图引发的深思
VikcyWinner
博客等级 码龄11年 12粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值