Javascript中this的指向一直是困扰我很久的问题,在使用中出错的机率也非常大。在面向对象语言中,它代表了当前对象的一个引用,而在js中却经常让我觉得混乱,它不是固定不变的,而是随着它的执行环境的改变而改变。
在Javascript中this总是指向调用它所在方法的对象。因为this是在函数运行时,自动生成的一个内部对象,只能在函数内部使用。
下面我们分几种情况深入分析this的用法:
1.全局的函数调用
function globalTest() {
this.name = "global this";
console.log(this.name);
}
globalTest(); //global this
以上代码中,globalTest()是全局性的方法,属于全局性调用,因此this就代表全局对象window。为了充分证明this是window,对代码做如下更改:
var name = "global this";
function globalTest() {
console.log(this.name);
}
globalTest(); //global this
name作为一个全局变量,运行结果仍然是“global this”,说明this指向的是window。在方法体中我们尝试更改全局name,再次调用方法输出“rename global this”, 说明全局的name在方法内部被更改。代码如下:
var name = "global this";
function globalTest() {
this.name = "rename global this"
console.log(this.name);
}
globalTest(); //rename global this
根据以上三段代码,我们得出结论:对于全局的方法调用,this指向的是全局对象window,即调用方法所在的对象。
2.对象方法的调用
如果函数作为对象的方法调用,this指向的是这个上级对象,即调用方法的对象。 在以下代码中,this指向的是obj对象。
function showName() {
console.log(this.name);
}
var obj = {};
obj.name = "ooo";
obj.show = showName;
obj.show(); //ooo
3.构造函数的调用
构造函数中的this指向新创建的对象本身。
function showName() {
this.name = "showName function";
}
var obj = new showName();
console.log(obj.name); //showName function
上述代码中,我们通过new关键字创建一个对象的实例,new关键字可以改变this的指向,将这个this指向对象obj。
我们再增加一个全局的name,用以证明this指向的不是global:
var name = "global name";
function showName() {
this.name = "showName function";
}
var obj = new showName();
console.log(obj.name); //showName function
console.log(name); //global name
在构造函数的内部,我们对this.name进行赋值,但并没有改变全局变量name。
4.apply/call调用时的this
apply和call都是为了改变函数体内部的this指向。 其具体的定义如下:
call方法:
语法:call(thisObj,Object)
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
说明:
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
apply方法:
语法:apply(thisObj,[argArray])
定义:应用某一对象的一个方法,用另一个对象替换当前对象。
说明:
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
var value = "Global value";
function FunA() {
this.value = "AAA";
}
function FunB() {
console.log(this.value);
}
FunB(); //Global value 因为是在全局中调用的FunB(),this.value指向全局的value
FunB.call(window); //Global value,this指向window对象,因此this.value指向全局的value
FunB.call(new FunA()); //AAA, this指向参数new FunA(),即FunA对象
FunB.apply(window); //Global value
FunB.apply(new FunA()); //AAA
在上述代码中,this的指向在call和apply中是一致的,只不过是调用参数的形式不一样。call是一个一个调用参数,而apply是调用一个数组。具体的会在以后的博文中单独阐述。
相关推荐
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
内容概要:本文介绍了一种基于周期移位图卷积(CS-ViG)的新型框架——CS-ViG-UNet用于红外小弱目标检测的方法,它采用了图像块为节点构建的视觉图神经网络来增强对小弱目标识别的能力。研究提出了周期移位稀疏图注意力机制,以及结合了CNN与U形架构的CS-ViG模块,实现了对小弱目标的有效捕获,并在公共数据集Sirst-Aug和IRSTD-1K上达到了先进的性能。在硬件条件如RTX3090加速下,模型能够高效地进行大批量的实时检测任务。 适合人群:从事计算机视觉、特别是小目标检测领域的科研人员和技术开发者。 使用场景及目标:应用于复杂背景下,需要快速精确定位并分离出小弱目标的任务场合。适用于军事、航空航天等高端应用场景,以及民用安防监控设备等需要可靠小目标检测能力的需求。 其他说明:文中提供的链接可以访问更多的项目资料和技术支持页面。此外,在实际测试环境下展示了该方法与其他现有算法相比较的优越性和创新点。同时指出了当前仍存在的限制,比如多物体场景下的误检率以及高亮背景干扰等问题,并给出了改进方向。
两个微信体育课程预订小程序-Fitnessw_xApp
风储调频,储能调频,保证真实,模型如图,保证正常使用
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
并离网逆变器仿真模型 逆变器PQ控制,Vf控制,无功能量发生器SVG,有源电力滤波器APF仿真模型
一种磁盘分区恢复软件,可以从损坏的磁盘映像hand_disk中恢复可能的分区表
计算光波导的电磁模式matlab代码.rar
了解 MATLAB 图像处理的基础知识MATLAB代码.rar
labview源码参考示例,可供参考学习使用
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
labview源码参考示例,可供参考学习使用
内容概要:本文提出了一种新的深度学习架构——HCF-Net(Hierarchical Context Fusion Network),旨在提升红外图像中小目标物体的检测精度和鲁棒性。HCF-Net采用了多尺度特征提取、平行补丁注意力模块(PPA)、维度感知选择性集成模块(DASI)以及多扩张通道细化器(MDCR),有效解决了由于红外图像低对比度及背景复杂所导致的小目标检测困难的问题。该研究对SIRST数据集进行了广泛实验评估,表明HCF-Net性能优于现有主流传统和深网方法。HCF-Net通过优化下采样过程中的特征表示与细节捕捉,大幅提高了对微小目标位置识别及形状边界描写的准确性。此外,研究团队还在论文中探讨了相关领域的最新进展和其他基于卷积神经网络的技术。 适合人群:对于计算机视觉尤其是遥感成像与自动目标识别有浓厚兴趣的研究人员和技术爱好者。同时适用于从事国家安全、军事侦察、灾害监测等领域工作的专业人士。 使用场景及目标:应用于各种需要精确探测小型目标物的应用场合,比如海上搜索救援行动、消防监控、边境安防巡逻、天文观测系统等。其目的是提高这些应用场景中设备的工作效率和服务质量。 其他说明:文中还介绍了大量关于红外线成像特性的基础知识,并详细阐述了几种传统的滤波器和机器学习算法用于解决这一任务时面临的局限性;强调了深度学习相对于传统方法所具有的明显优势。
STM32驱动lcd1602显示adc采集电压显示程序源码。 主控芯片采用stm32f103,包括程序源码和protues仿真protues版本8.8. 需要做AD转的不要错过。 程序源码注释详细,非常适合单片机开发的人员。
微信小程序彩票页面_厚江
labview源码参考示例,可供参考学习使用
单相逆变器仿真模型 电压电流双闭环 双闭环PI控制 LC滤波 SPWM调制 输出交流电压220V 50Hz 图2为模型输出电压电流 功率波形 Matlab Simulink
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。