Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >this怎么那么难呢?

this怎么那么难呢?

作者头像
用户3258338
发布于 2019-12-19 07:00:44
发布于 2019-12-19 07:00:44
47500
代码可运行
举报
运行总次数:0
代码可运行

拥有一段关于你的回忆已经足够了~


今天是2019年12月17年,星期三。今天北京是个大晴天,我下楼遛弯的时候看到天灰常的蓝。2019年还有不到15天就结束了,各位宝宝年初的目标实现了几个呢?emmm,我还有一个目标没有实现,时间不多了,作为明年的目标吧,哈哈哈哈哈哈哈哈~

对于我这菜鸟级别的前端开发工程师来说this简直太难了,每次只能让自己认识的深入一点点,也只能这样了。

这次的重新学习this,有一个心得:想要学懂this,一定要先学习作用域。

this与词法作用域


在js内部,作用域确实与对象类似,可见的标识符都是它的属性。但是作用域无法通过js代码访问,它存在于js引擎内部。

思考下面的代码,它试图跨域边界,使用this来隐式引用函数的词法作用域。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function foo(){
   var a=2;
   this.bar(); 
}
function bar(){
  console.log(this.a)
}
foo() // ReferenceError: a is not define

以上代码调用bar()最自然的方法是省略前面的this,直接使用词法引用标识符。

此外,这段代码的开发者还试图使用this联通foo()和bar()的词法作用域。从而让bar()可以访问foo()作用域里的变量啊。这是不可能实现的,使用this不可能在词法作用域中查到什么。

每当你想要this和词法作用域的查找混合使用时,一定要提醒自己,这是无法实现的。

this到底是什么


this是在运行时进行绑定的,并不是在编写时绑定,它的上下文取决于函数调用时的各种条件。this的绑定取决于函数的调用方式。

当一个函数被调用时,会创建一个活动记录(有时候也成为执行上下文)。这个记录包含函数在哪里被调用(调用栈)、函数的调用方式、传入的参数等信息。this就是这个记录的一个属性,会在函数执行的过程中用到。

this到底是什么


this是在运行时进行绑定的,并不是在编写时绑定,它的上下文取决于函数调用时的各种条件。this的绑定取决于函数的调用方式。

当一个函数被调用时,会创建一个活动记录(有时候也成为执行上下文)。这个记录包含函数在哪里被调用(调用栈)、函数的调用方式、传入的参数等信息。this就是这个记录的一个属性,会在函数执行的过程中用到。

调用位置


在理解this绑定过程之前,首先要理解调用位置:函数在代码 中被调用的位置。最重要的是要分析调用栈。(为了到达当前执行位置所调用的所有函数)我们关心的调用位置就在当前正在执行的函数的前一个调用中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function baz(){  //当前调用栈是:baz,因此当前调用位置是全局作用域
  console.log("baz");
  bar() // bar的调用位置
}
function bar(){ //当前调用栈是 bar->bar ,因此当前调用位置是在baz中
   console.log("bar");
   foo(); // foo的调用位置
}

function foo(){ //当前调用栈是baz->bar -> foo 因此当前调用位置是在bar中
  console.log("foo")
}
baz(); // baz的调用位置

从调用栈中分析出真正的调用位置,决定了this的绑定。

绑定规则


先找到调用位置,然后根据优先级应用下面的四条规则的哪一条

- 默认规则:

无法应用其他规则的默认规则

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function foo(){
  console.log(this.a)
}
var a =2;
foo();

foo()是直接使用不带任何修饰的函数引用进行调用的,因此只能使用默认绑定。

若使用严格模式,则不能将全局对象进行默认绑定

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function foo(){
  "use strict";
   console.log(this.a) 
 }
 var a = 2;
 foo() // TypeError : this is undefined

- 隐式绑定:

另一条需要考虑的规则是调用位置是否有上下文对象,或者说是否被某个对象拥有或者包含。

那个... 太晚了,该睡觉了,明天还要上班,明天继续,宝宝们也早点睡

愿我们有能力不向生活缴械投降---Lin

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 女程序员的日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入理解JavaScript中的this
很多人看到this这个关键字就会感觉很恶心,因为this 关键字是 JavaScript 中最复杂的机制之一。它是一个很特别的关键字,被自动定义在所有函数的作用域中。但是即使是非常有经验的 JavaScript 开发者也很难说清它到底指向什么。
OECOM
2020/07/02
5280
深入理解JavaScript中的this
你不知道的javaScript笔记(2)
this和对象原型 this是一个很特别的关键字,被自动定义在所有函数的作用域中 // foo.count 是0,字面理解是错误的     function foo(num) {         console.log("foo:"+ num);         this.count++;     }     foo.count = 0;     var i;     for(i=0;i<10;i++){         if(i>5){             foo(i)         }     }
用户1197315
2018/01/22
4910
this 之谜揭底:从浅入深理解 JavaScript 中的 this 关键字(一)
沉浸式趣谈
2024/03/13
1530
this 之谜揭底:从浅入深理解 JavaScript 中的 this 关键字(一)
你不知道的JavaScrpit(上卷) 随记(二)
this是在运行时进行绑定的,并不是在编写时绑定,他的上下文取决于函数调用时的各种条件。this的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。
邱邱邱邱yf
2021/12/22
3480
JS入门难点解析7-this
(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)
love丁酥酥
2018/08/27
7620
你不知道的this(1)
this关键字是JavaScript中最复杂的机制之一,同时,它也是JavaScript中最重要的机制之一。但是,即使是非常有经验的JavaScript开发者也很难说清楚它到底是什么。
Karl Du
2020/10/23
3730
深入理解this绑定
js中的词法作用域是静态的,需要关注的往往是函数的声明位置而不是调用位置—–例如闭包引用自由变量时,应该注意闭包函数的声明位置;而this却在某种程度上类似于动态作用域,this到底绑定的是谁,要看函数的调用位置(或者说调用方法),只有在函数调用的时候this的指向才能被确定。
Chor
2019/11/07
4950
this
调用位置会使用obj上下文来引用函数。注意,当使用回调函数时,因为函数作为参数传入时,实际上是一个隐式赋值操作,如下:
菜的黑人牙膏
2019/01/15
2580
JavaScript复习之作用域链
之前复习到的执行上下文里在ES3版本里说过它包含的三大内容是变量对象,作用域链,this指向。以及ES6版本里词法环境中有的外部环境引用outer。 都是涉及到了今天要复习的知识点, 也就是JavaScript中存在着基于作用域而产生的一条类似链表的链路。
用户6256742
2024/06/28
970
JavaScript复习之作用域链
带你真正了解 JavaScript 中的 this
任何情况下,this 都不会默认指向函数自己,除非使用 bind 绑定的方式修改 this 为函数自己。
石燕平
2019/10/14
4900
再说 this 指向问题
因为,函数调用时不带其他修饰的函数调用,使用默认绑定 this 到全局 window 对象上。
公众号---人生代码
2021/05/08
8430
(ES5版)深入理解 JavaScript 执行上下文和执行栈
最近在研究 JavaScript 基础性的东西,但是看到对于执行上下文的解释我发现有两种,一种是执行上下文包含:scope(作用域)、variable object(变量对象)、this value(this 值),另外一个种是包含:lexical environment(词法环境)、variable environment(变量环境)、this value(this 值)。
桃翁
2020/03/25
9740
(ES5版)深入理解 JavaScript 执行上下文和执行栈
字节跳动最爱考的前端面试题:JavaScript 基础
JavaScirpt 使用 Number 类型来表示数字(整数或浮点数),遵循 IEEE 754 标准,通过 64 位来表示一个数字(1 + 11 + 52)
一只图雀
2021/03/03
1.5K0
字节跳动最爱考的前端面试题:JavaScript 基础
【前端进阶】深入浅出 JavaScript 中的 this
笔者最近在看 你不知道的JavaScript上卷,里面关于 this 的讲解个人觉得非常精彩。JavaScript 中的 this 算是一个核心的概念,有一些同学会对其有点模糊和小恐惧,究其原因,现在对 this 讨论的文章很多,让我们觉得 this 无规律可寻,就像一个幽灵一样
GopalFeng
2020/10/27
4120
【前端进阶】深入浅出 JavaScript 中的 this
《你不知道的JavaScript》 (上) 阅读摘要
本书属于基础类书籍,会有比较多的基础知识,所以这里仅记录平常不怎么容易注意到的知识点,不会全记,供大家和自己翻阅;
前端下午茶
2019/06/27
5770
JavaScript 设计模式学习第二篇-关于this、new、bind、call、apply
虽然标题关于this、new、bind、call、apply,但实际上这些都离不开 this,因此本文将着重讨论 this,在此过程中分别讲解其他知识点。
越陌度阡
2020/11/26
3050
说说这个this啊
上述代码中foo()不带任何修饰函数引用进行调用的,因此只能使用默认绑定,无法应用其他规则。 像这种独立函数调用是最常见的方式。值得一提的是在严格模式下,全局对象无法使用默认绑定,this绑定的是undefined。
Jean
2018/10/11
8801
说说这个this啊
兄台: 作用域、执行上下文了解一下
变量的词法作用域(简称:作用域)是程序中可以访问变量的区域。通俗地理解,作用域就是变量与函数的可访问范围,即作用域控制着变量和函数的可见性和生命周期。
前端柒八九
2022/08/25
5370
兄台: 作用域、执行上下文了解一下
《你不知道的JavaScript》:this 绑定规则
关于this,之前说过,this的指向取决于函数调用位置而非函数定义位置。谁调用函数,则函数上下文中的this就指向谁。
前端_AWhile
2019/08/29
5530
面试题之:JavaScript中this以及apply/call/bind的用法
this 的 4 种绑定规则分别是:默认绑定、隐式绑定、显式绑定、new 绑定。优先级从低到高。
用户10106350
2022/10/28
2990
面试题之:JavaScript中this以及apply/call/bind的用法
相关推荐
深入理解JavaScript中的this
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验