javascript中this的指向问题

news2024/9/27 17:36:19

this的五种绑定问题

1,默认绑定

默认绑定通常是指函数独立调用,不涉及其他绑定规则。

  • 非严格模式下,this指向window
  • 严格模式,下,this指向undefined. 在普通函数内部的this
  • let/const定义的变量存在暂时性死区,而目不会挂载到window对象上,因此print中是无法获取到a和b的。
  • 自执行函数只要执行到就会运行,并且只会运行一次,this指向window.
  • 如果函数是独立运行的,函数中的this依然是指向window对象。
  • 匿名函数为默认绑定

2,隐式绑定

  • 函数的调用是在某个对象上触发的,即调用位置存在上下文对象,通俗点说就是 XXX.func() 这种调用模式。此时func的this指向XXX。

  • 但如果存在链式调用,例如XXX.YYY.ZZZ.func,记住一个原则: this永远指向最后调用它的那个对象。

  • 隐式绑定可是个调皮的东西,一不小心它就会发生绑定的丢失。一般会有两种常见的丢失

  • 使用另一个变量作为函数别名,之后使用别名执行函数

    var foo = obi.foo:
    上面将obi.foo赋值给foo,就是将foo也指向了obi.foo所指向的堆内存,此后再执行foo,相当于直接执行的堆内存的函数,与obi无关,foo为默认绑定。笼统的记,只要fn前面什么都没有,肯定不是隐式绑定。

    var obj2 ={a: 3,foo: obj.foo}
    obj2.foo指向了obi.foo的堆内存,此后执行与obj无关(除非使用call/apply改变this指向)

  • 将函数作为参数传递时会被隐式赋值

    doFoo(obj.foo)
    obi.foo作为实参,在预编译时将其值赋值给形参fn,是将obj.foo指向的地址赋给了fn,此后fn执行不会与obj产生任何关系。fn为默认绑定。
    只要涉及形参了,就只是传递了一个地址,和原来的没有关系了

  • 隐式绑定丢失之后,this的指向会启用默认绑定,

3,显式(硬)绑定

  • 显式绑定比较好理解,就是通过call()、apply()、bind()等方法,强行改变this指向
  • call和apply函数会立即执行
  • bind函数会返回新函数,不会立即执行函数
  • call和apply的区别在于call接受若干个参数,apply接受数组

4,new绑定

  • 创建一个空的简单JavaScript对象 (即{}) :
  • 为步骤1新创建的对象添加属性proto,将该属性链接至构造函数的原型对象
  • 将步骤1新创建的对象作为this的上下文: 如果该函数没有返回对象,则返口this.
  • 通过new来调用构造函数,会生成一个新对象,并日把这个新对象绑定为调用函数的this

5, ES6新增箭头函数绑定

  • 箭头函数没有自己的this,它的this指向外层作用域的this,
  • 且指向函数定义时的this而非执行时this指向外层作用域的this
  • 箭头函数没有this绑定,但它可以通过作用域链查到外层作用域的this指向函数定义时的this而非执行时
  • JavaScript是静态作用域,就是函数定义之后,作用域就定死了跟它执行时的地方无关。更详细的个绍见JavaScript之静态作用域与动态作用域

总结

在这里插入图片描述

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

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

相关文章

elk实践

1、背景 鉴于现在项目中的日志比较乱,所以建议使用现在较为流行的elk收集日志并展示; 2、下载、配置与启动 在下载 Elastic 产品 | Elastic 官网下载filebeat、logstash、elasticSearch、kibana 版本要一致 本人测试用的7.14 mac版本 实际生产使用7.14…

甘特图来搞定跨部门协作难的问题!项目经理必备

在很多大的工程项目、IT项目、市场项目中,都会涉及诸多对人员、时间、质量等的控制,这往往需要跨部门协作。但目前大多数企业跨部门协作还是通过微信、口口相传的方式进行,也导致了以下这些问题的频现: 辗转多个群聊提取有用的信息…

笔试强训(三十九)

目录一、选择题二、编程题2.1 字符串计数2.1.1 题目2.1.2 题解一、选择题 (1)/etc/resolv.conf的用途是(C) A.邮件服务的配置文件 B.DHCP的设置文件 C.DNS解析的设置文件 D.网络路由的设置文件 (2)能够pin…

Redis 通用指令

文章目录一、key通用指令1-1 基本操作1-2 时效性控制1-3 查询操作1-4 扩展操作二、数据库通用指令提示:以下是本篇文章正文内容,Redis系列学习将会持续更新 一、key通用指令 ● 特征:key是一个字符串,通过key获取redis中保存的数…

警惕 “格机软件” 格式化手机全字库..不要轻易给不明觉厉的软件给root权限

以前的玩机界中有【锁机】软件。就是你安装一个软件后他会锁住屏幕。导致你无法操作手机。屏幕出现QQ联系方式等 勒索钱财。目前刷机界中的【格机】更胜一筹,直接格式化你手机全部分区没商量............ 警惕:不要给不明觉厉的软件 模块 刷机包等等给r…

Flink的状态持久化和状态后端

状态持久化 检查点的保存离不开 JobManager 和 TaskManager,以及外部存储系统的协调。在应用进行检查点保存时,首先会由 JobManager 向所有 TaskManager 发出触发检查点的命令;TaskManger 收到之后,将当前任务的所有状态进行快照保…

搭建自己Kindle电子书图书馆,并可远程访问

在电子书风靡的时期,大部分人都购买了一本电子书,虽然这本电子书更多的时候是被搁置在储物架上吃灰,或者成为盖泡面的神器,但当亚马逊发布消息将放弃电子书在中国的服务时,还是有些令人惋惜,毕竟谁也不想大…

【虾神白话空间统计】笔记:置信度、零假设、PZ值、随机分布

以下内容摘录节选学习自虾神专栏 很重要的一个概念:在空间统计中,随机和均匀经常是一个意思 一个随机抽样的例子 新版白话空间统计(9):置信度的初探 这里面讲经研究,有72%的男生喜欢打篮球,…

【Vue】基础语法(创建项目|数据绑定|事件绑定|声明方法|插值表达式|属性值绑定|循环数组|v-if控制||计算属性|监听器|过滤器)

文章目录1. Vue 思想:2. VUE 的基本使用2.1 创建项目并进行基础测试2.2 数据绑定2.3 事件绑定2.4 声明方法2.5 插值表达式2.6 给任意属性绑定值2.7 v-for 循环数组或对象的使用2.8 v-if 和 v-show 控制是否显示2.9 计算属性和监听器属性2.10 过滤器属性3. 总结 Vue …

智慧工程安监物联网+云平台解决方案-最新全套文件

智慧工程安监物联网云平台解决方案-最新全套文件一、建设背景监管部门所处困境建筑施工业存在难点工程现场安全现象二、建设思路实现目标三、建设方案四、获取 - 物联网全套最新解决方案合集一、建设背景 智慧工地 是指运用 信息化 手段,通过 三维 设计平台对 工程…

Linux发行版---常用命令操作快速熟悉

针对linux发行版(如ubuntu、raspian等)的基础使用说明,以快速熟悉linux发行版的操作。 一、系统信息 查看处理器架构:arch查看内核版本:cat /proc/version; uname -a查看操作系统版本:head -n 1 /etc/iss…

c语言:初识结构体

初识结构体一.结构体声明1.结构体的概念2.声明二.结构体的基础使用三.结构体变量的定义和初始化一.结构体声明 1.结构体的概念 结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量 这里与数组做出区分:数组是一组相同类型元…

上海 Meetup | 一键获取 11 大云原生热门开源项目技术分享入场券

活动介绍 微服务 x 容器开源开发者 Meetup 是由阿里云飞天 club 与云原生应用平台共同打造,面向一线开发者的技术交流活动,整体内容聚焦容器 & 微服务方向,旨在通过热门的开源技术、云原生在企业的应用实践案例、架构设计思维等&#xf…

CopyOnWriteArrayList 是如何保证线程安全的?

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 前言 大家好,我是小彭。 在上一篇文章里,我们聊到了ArrayList 的线程安全问题,其中提到了 CopyOnWriteArrayList 的解决方法。那么 CopyOn…

倒计时9天|Zabbix中国峰会15位重磅嘉宾抢先看!

2022Zabbix峰会演讲嘉宾 (有奖互动:转发本文或任一讲师海报至朋友圈,保留5分钟,即可获得Zabbix定制周边礼品一份,仅限100份,先到先得,详情联系文末小Z) 第7届Zabbix中国峰会将于12月2-3日举行…

腾讯产品经理的自动化工作流

作为腾讯产品经理的一员,Johnny中扬每天需要面对来自各方繁琐的需求。如何管理好用户需求、并及时规划、完成、反馈,上周中扬和我们分享了他的工作流。如果你也是产品经理,或者对腾讯产品经理的工作日常比较感兴趣,错过了上次的直…

【数据结构】堆的实现

堆1.堆:一种二叉树2.堆的概念及结构3.堆的实现3.1 创建堆的结构3.2 堆的初始化3.3 堆的插入3.4 堆的向上调整法(up)3.5 打印堆的数据3.6 到这里就可以实现一个基本的堆了3.7 向下调整法down(非常重要的一个方法)3.8 最…

Java项目:JSP校园运动会管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目包含三种角色:运动员、裁判员、管理员; 运动员角色包含以下功能: 运动员登录,个人信息修改,运动成绩…

【网络安全】——sql注入之奇淫巧技bypass(持续更新中)

作者名:Demo不是emo 主页面链接:主页传送门创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷座右…

微信点餐小程序开发_分享微信点餐小程序可以实现哪些功能

线下餐饮实体店都开始摸索发展网上订餐服务。最多人选择的是入驻外卖平台,但抽成高,推广还要另买流量等问题,也让不少商家入不敷出。在这种情况下,建立自己的微信订餐小程序,做自己的私域流量是另一种捷径。那么&#…