this,apply,call,bind 超详细合集

前言

之前在学习this关键字的时候,其实一直都是懵懵懂懂。知道答案但是不知道所以。一直想知道为什么是这样?为什么this默认指向全局呢?今天忽然释然了,我又不是开发这门语言的人,我为什么要纠结这些。那今天就来讲讲this的指向的不同场景。
以下是this的所有指向情况

  • 默认绑定:当一个函数独立调用时,不带任何修饰符的调用,该函数的this指向window,默认就是指向window(严格模式下面,this默认绑定就是undefined)

  • 隐式绑定:当一个函数被某个对象所拥有,或者函数被某个上下文对象调用时。该函数中的this指向该上下文对象

  • 隐式丢失:当一个函数被多个对象链式调用时,this指向最近的那个对象(就近原则)。

  • 显示绑定:将函数的this指向特定的对象,call ,apply ,bind

  • new绑定: 构造函数的this指向实例对象

那让我来逐一过一遍所有情况,下面所有代码,要在浏览器中执行,因为nodeJS的全局对象并不是window而是global,所以nodeJS里面打印的是undefined

默认绑定

例题

var a = 3;
function foo() {var a = 2;foo.a = 1;console.log(this.a);
}
foo();

题解

上面一共三个a,分别是

1. 全局中的变量a =3;

2. 函数内定义的变量a =2,

3. 函数foo对象的属性a =1;

再来看看上面这段代码,foo()直接调用,前面或者后面没有加任何修饰符并且是独立调用,那么直接套this默认指向全局window,而在全局定义的var变量会自动挂载在window上面(global上面妹油嗷~~),这意味这console.log(this.a)这个this指向的就是全局中的a,答案打印3。

隐式绑定

例题

var a =4;
var obj = {a:3,foo:foo
}
function foo() {var a = 2;foo.a = 1;console.log(this.a);
}
obj.foo();

题解

上面一共四个a,分别是

1. 全局中的变量a =4;

2. obj属性a =3;

3. 函数内定义的变量a =2,

4. 函数foo对象的属性a =1;

分析上面代码,foo的执行情况属于第二种隐式绑定,foo是作为obj的属性方法执行的,this就是指向obj,所以答案就是3。

隐式丢失

例题

var a =5;
var obj2 ={obj1:obj1,a : 4
}
var obj1 = {a:3,foo:foo
}
function foo() {var a = 2;foo.a = 1;console.log(this.a);
}
obj2.obj1.foo();

题解

上面一共五个a,分别是

1. 全局中的变量a =5;

2. obj2对象中有属性a=4,obj1也是作为obj2的一个属性;

3. obj1属性a =3;

4. 函数内定义的变量a =2,

5. 函数foo对象的属性a =1;

分析上面代码,foo的执行情况属于第三种隐式丢失,foo是作为obj2的属性对象obj1的方法执行的,当一个函数被多个对象链式调用时,this指向最近的那个对象(就近原则),所以this指向的是obj1,答案就为3。

显示绑定(call,apply,bind)

例题

var a =3;
var obj = {a :2
}
function foo(){console.log(this.a);
}
foo();
foo.call(obj);
foo.apply(obj);
foo.bind(obj)();

题解

上面一共两个a,分别是

1. 全局中的变量a =3;

2. obj对象中有属性a=2

分析上面代码,一共有四个foo的执行,

  • foo(),这个是默认绑定,this直接指向的是全局,所以打印的是3

  • foo.call(obj),这个是显示绑定,功能就是让调用call的方法的this指向传进来的对象参数,这里是foo调用的call方法,传入的参数是obj,所以foo内部的this指向的是obj,打印的是2

  • foo.apply(obj),这个和call使用原理方法基本一致,唯一不同就是在于callapply传入的第一个参数都是this要指向的对象,而后面的参数,call是一个个单独参数,而apply是一个数组,所以这里是foo调用的apply方法,this指向的是对象obj,所以打印的是2

  • foo.bind()(obj),这个和call还有apply使用原理方法就有点不一样了,不过原理基本都是让调用这个方法的this指向传入的参数对象。但是bind会返回一个已绑定this为参数对象的新函数,您需要先保存这个新函数,然后再调用它。我这里是直接调用没有保存,所以打印的依然是2

new绑定

例题

function Person(age){this.age =age;
}
let person =new Person(18);
console.log(person.age);

题解

这里定义了一个Person函数,当作一个类,new了一个person实例,打印的结果为18。想知道详细原理的可以看看我的这篇文章一篇文章,new,原型,单例设计模式全部搞定! - 掘金 (juejin.cn),这里简单描述就是,

  1. 创建一个新的对象,这里用obj来形容
  2. obj.__proto__ = Person.prototype,执行复制代码;
  3. 返回新的对象
    所以这里的this指向的是new创建出来的实例对象,打印的值就为18.

结束语

到此为止this的所有情况全部列举出来了,本次分享就全部到此结束,如果大家还有什么补充或者纠正,欢迎评论区评论,谢谢大家>_<.

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

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

相关文章

Apache Doris 2.0.11 版本正式发布

亲爱的社区小伙伴们&#xff0c;Apache Doris 2.0.11 版本已于 2024 年 6 月 5 日正式与大家见面&#xff0c;该版本提交了 123 个改进项以及问题修复&#xff0c;进一步提升了系统的性能及稳定性&#xff0c;欢迎大家下载体验。 官网下载&#xff1a; https://doris.apache.o…

jenkins插件之Jdepend

JDepend插件是一个为构建生成JDepend报告的插件。 安装插件 JDepend Dashboard -->> 系统管理 -->> 插件管理 -->> Available plugins 搜索 Jdepend, 点击安装构建步骤新增执行shell #执行pdepend if docker exec phpfpm82 /tmp/composer/vendor/bin/pdepe…

ComfyUI工作流分享-黏土特效工作流

大家给的教程都是苹果端使用Remini的软件制作&#xff0c;免费白嫖7天&#xff0c;7天后就要收费&#xff0c;作为ComfyUI技术党&#xff0c;当然是选择自己实现了&#xff0c;搭建一套工作流就搞定&#xff0c;这不&#xff0c;今天就来分享一套对应的黏土效果工作流&#xff…

使用Python实现GLM解码器的示例(带有Tensor Shape标注)

ByteDance的“Glancing Transformer”&#xff08;GLAT&#xff09;是一种用于无自回归神经机器翻译&#xff08;NAT&#xff09;的创新模型。该模型通过一种称为“glancing sampling”的策略&#xff0c;显著提高了翻译的质量和效率。 GLAT 的主要特性 Glancing Sampling 机制…

TSINGSEE青犀视频:城市道路积水智能监管,智慧城市的守护者

随着城市化进程的加快&#xff0c;城市道路网络日益复杂&#xff0c;尤其在夏季&#xff0c;由于暴雨频发&#xff0c;道路积水问题成为影响城市交通和市民生活的重要因素之一。传统的道路积水监测方式往往依赖于人工巡逻和简单的监控设备&#xff0c;这些方法存在效率低下、响…

数据中台案例04-广西壮族自治区自然灾害应急能力提升工程预警指挥项目—数据治理系统和现场应急感知技术装备采购需求

数据底座数据汇聚融合能力提升数据汇聚融合工具数据接入工具API数据接入组件、实时数据接入组件、空间数据接入组件、数据库接入组件、文件接入组件、数据接入概览组件、批量作业、数据连接管理组件、数据接入任务管理组件、数据接入监控组件数据处理工具数据转换、数据去重、数…

CAN总线学习笔记-CAN帧结构

数据帧 数据帧&#xff1a;发送设备主动发送数据&#xff08;广播式&#xff09; 标准格式的11ID不够用了&#xff0c;由此产生了扩展格式 SOF&#xff1a;帧起始&#xff0c;表示后面一段波形为传输的数据位 ID&#xff1a;标识符&#xff0c;区分功能&#xff0c;同时决定优…

先进制造aps专题十一 国内软件/erp行业的现状及对aps行业的启示

看到一个帖子 中国软件行业几乎全军覆没 OSC开源社区 2024-06-03 15:58 广东 刚刚网上冲浪刷到的 网友锐评&#xff1a;都是客户关系型公司。 知名大 V 「Fenng」评论称&#xff1a; 这里所谓的软件行业公司如果立刻倒闭&#xff0c;才能够利好中国整个行业软件生态。有个网…

巨详细Linux安装Nacos教程

巨详细Linux安装Nacos教程 1、检查是否有残留nacos版本2、上传安装包至服务器2.1安装包获取2.2创建相关目录 3、安装Nacos4、配置Nacos4.1修改数据源4.2新建nacos数据库4.3启动nacos4.4把nacos进程交给systemctl管理4.5设置nacos开机自启动 1、检查是否有残留nacos版本 rpm -q…

【ArcGIS微课1000例】0118:一文讲清楚tif(geotiff)栅格数据格式

文章目录 一、Tiff概述二、GeoTiff概述1. ovr文件2. tfw文件3. xml文件4. dbf文件一、Tiff概述 TIFF(Tagged Image File Format)是一种常见的图像文件格式,它被广泛用于存储和传输各种类型的图像数据。下面是对TIFF格式数据的介绍: 图像存储:TIFF格式可以存储多通道的位…

DB2问题解决:SQL0270N Function not supported (Reason code = “100“). SQLSTATE=42997

在执行修改表结构sql语句过程中&#xff0c;报错&#xff1a;SQL0270N Function not supported (Reason code "100"). SQLSTATE42997 。这个错误通常与表的 DATA CAPTURE 设置有关。如果某些表的 DATA CAPTURE 设置为 CHANGES&#xff0c;则某些表结构修改操作可能不…

Unity基础实践小项目

项目流程&#xff1a; 需求分析 开始界面 选择角色面板 排行榜面板 设置面板 游戏面板 确定退出面板 死亡面板 UML类图 准备工作 1.导入资源 2.创建需要的文件夹 3.创建好面板基类 开始场景 开始界面 1.拼面板 2.写脚本 注意事项&#xff1a;注意先设置NGUI的分辨率大小&…

问题:律师会见委托人的方式包括团体会见和( )。 #职场发展#笔记#学习方法

问题&#xff1a;律师会见委托人的方式包括团体会见和&#xff08; &#xff09;。 参考答案如图所示

Java 线程池的奥秘:让你的代码跑得像火箭!

欢迎来到Java线程池的奇幻世界&#xff01;如果你曾经觉得Java代码跑得像蜗牛&#xff0c;或者你的应用程序偶尔像是喝醉了酒&#xff0c;那你可能需要了解一下Java线程池的秘密武器&#xff01;今天我们就来深入浅出地揭开线程池的神秘面纱&#xff0c;顺便拯救你的应用程序于…

【Python报错】已解决TypeError: can only concatenate str (not “int“) to str

成功解决“TypeError: can only concatenate str (not “int”) to str”错误的全面指南 一、引言 在Python编程中&#xff0c;字符串&#xff08;str&#xff09;和整数&#xff08;int&#xff09;是两种基本的数据类型。然而&#xff0c;当我们尝试将这两种类型的对象进行连…

[matlab]折线图之多条折线如何绘制实心圆作为标记点

使用MarkerFaceColor是标记点填充的颜色&#xff0c;b&#xff0c;表示blue&#xff0c;蓝色 plot(x, a, d--, MarkerFaceColor, b); % 绘制仿真结果的曲线如果一张图多条曲线那么每条曲线需要单独调用一次plot&#xff0c;每个plot间用hold on 连接 plot(x, a, d--, MarkerF…

通配符SSL证书快速申请攻略

一、什么是通配符SSL证书 通配符SSL证书又叫泛域名SSL证书&#xff0c;可以保护一个主域名及其所有二级子域名&#xff0c;并对该级子域名数量无限制&#xff0c;且添加新的该级子域名无须另外付费。 二、通配符SSL证书有哪些优势 1.节省时间和金钱&#xff1a;与购买和安装…

深度学习中的监督学习

深度学习中的监督学习 监督学习&#xff08;Supervised Learning&#xff09;是深度学习中最常见的一种学习方法&#xff0c;它依赖于标注数据集进行训练&#xff0c;通过学习输入数据与其对应的标签之间的映射关系&#xff0c;最终能够对未见过的数据进行准确预测。以下是对深…

Android海外用户增长

目录 文章背景介绍 概念解释&#xff1a; Google FireBase Facebook Appsflyer Tiktok 文章背景介绍 做海外app的【用户增长】功能必经之路&#xff0c;Google的FireBase、AppsFlyer、Facebook、Tiktok&#xff0c;Message等SDK可能都需要接触&#xff0c;以上SDK是我们在…

Spring Boot + URule 实现可视化规则引擎,太优雅了!

Spring Boot URule 实现可视化规则引擎&#xff0c;太优雅了&#xff01; 一、背景二、介绍三、安装使用四、基础概念整体介绍库文件变量库文件常量库文件参数库文件动作库文件规则集向导式规则集脚本式规则集 决策表其他 五、运用场景六、总结 一、背景 前段时间&#xff0c…