当前位置:网站首页>this是什么(你不知道的JS)
this是什么(你不知道的JS)
2022-07-30 05:45:00 【没事下辈子小心点】
原来转载了一篇this的文章,链接在这里
综述
this 提供了一种更优雅的方式来隐式“传递”一个对象引用,因此可以将 API 设计得更加简洁并且易于复用。
function identify() {
return this.name.toUpperCase();
}
function speak() {
var greeting = "Hello, I'm " + identify.call(this);
console.log(greeting);
}
var me = {
name: "Kyle" };
var you = {
name: "Reader" };
identify.call(me); // KYLE 直接是me = this
identify.call(you); // READER
speak.call(me); // Hello, 我是 KYLE
speak.call(you); // Hello, 我是 READER
现在就不以概念来解释this到底是什么了,我们以应用场景来解释吧。
先说明一下this的几种分类,应用场景中再详细阐述:下面判断this的依次优先级
1、例外情况(被忽略的this+间接引用+软绑定)
2、new绑定
3、显式绑定(硬绑定+API调用的“上下文”)
4、隐式绑定
只会绑定上一层的引用链,当函数引用有上下文对象时,隐式绑定规则会把函数调用中的 this 绑定到这个上下文对象。因为调用 foo() 时 this 被绑定到 obj2,因此 this.a 和 obj2.a 是一样的。
function foo() {
console.log(this.a);
}
var obj2 = {
a: 42,
foo: foo
};
var obj1 = {
a: 2,
obj2: obj2
};
obj1.obj2.foo(); // 42
丢失现象
function foo() {
console.log(this.a);
}
var obj = {
a: 2,
foo: foo
};
var bar = obj.foo; // 函数别名!
var a = "oops, global"; // a 是全局对象的属性
bar(); // "oops, global"
P86
5、默认绑定 :非严格模式下的,默认会绑定到全局对象上,严格模式会TypeError: this is undefined
function foo() {
console.log(this.a); }
var a = 2;
foo(); // 2
6、词法规则
应用场景:
在所有需要this的场景中,我们可能在函数里面需要在引用域里用到:
1、上一层的对象属性
2、某一层的对象属性
3、全局对象属性
4、使用完某一层对象属性后,还要用到全局对象属性
5、使用给定对象的属性
6、在特殊处理函数中可能需要多种
对象的属性
举几个栗子
如果要用到上一层对象的属性,可以用隐式绑定
function foo() {
var a = 2;
this.bar();
}
function bar() {
console.log(this.a);
}
foo(); // ReferenceError: a is not defined
这段代码中的错误不止一个。虽然这段代码看起来好像是我们故意写出来的例子,但是实际上它出自一个公共社区中互助论坛的精华代码。这段代码非常完美(同时也令人伤感)地展示了 this 多么容易误导人。
首先,这段代码试图通过 this.bar() 来引用 bar() 函数。这是绝对不可能成功的,我们之后会解释原因。调用 bar() 最自然的方法是省略前面的 this,直接使用词法引用标识符。
此外,编写这段代码的开发者还试图使用 this 联通 foo() 和 bar() 的词法作用域,从而让bar() 可以访问 foo() 作用域里的变量 a。这是不可能实现的,你不能使用 this 来引用一个词法作用域内部的东西。
每当你想要把 this 和词法作用域的查找混合使用时,一定要提醒自己,这是无法实现的。
this 实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用。
1、回调函数中,例如事件处理器或者定时器:(箭头函数)
边栏推荐
猜你喜欢

边境的悍匪—机器学习实战:第十五章 使用CNN和RNN处理序列

常用损失函数(一):Focal Loss

Target detection, object classification and semantic segmentation of UAV remote sensing images based on PyTorch deep learning
![Massive remote sensing data processing and application of GEE cloud computing technology [basic, advanced]](/img/38/239933ac987da762135db2d13902d0.png)
Massive remote sensing data processing and application of GEE cloud computing technology [basic, advanced]

QT串口动态实时显示大量数据波形曲线(四)========“界面的美化与处理”

QT每周技巧(3)~~~~~~~~~串口添加

边境的悍匪—机器学习实战:第十六章使用RNN和注意力机制进行自然语言处理

【江科大自化协stm32F103c8t6】笔记之【入门32单片机及EXTI外部中断初始化参数配置】

FPGA解析B码----连载1

MATLAB怎么在图像中显示nii文件切片信息?
随机推荐
经典排序之插入排序
工程师必看:常见的PCB检测方法有哪些?
jvm之方法区
二叉树(一):深度优先遍历与广度优先遍历
重磅揭晓!第十四届深创赛福田预选赛区暨华秋第八届硬创大赛华南分赛区晋
CLUE模型构建方法、模型验证及土地利用变化情景预测
卷积神经网络(CNN)之卷积操作、池化操作、激活函数
Self-augmented Unpaired Image Dehazing via Density and Depth Decomposition程序运行记录
边境的悍匪—机器学习实战:第十一章 训练深度神经网络
逻辑右移和算术右移区别
用户密码加密编码使用 Bcrypt 代替 MD5,SHA1和SHA256
BLDC电机应用持续火爆,“网红神器”筋膜枪前景几何?
Application of remote sensing, GIS and GPS technology in hydrology, meteorology, disaster, ecology, environment and health
FPGA解析B码----连载2
QT连载3:基于QT和STM32H750的LORA试验平台(2)
关于map对key自定义排序
昆仑通态屏幕制作(连载5)---基础篇(串口接收,文本与灯显示)
Knowledge distillation method of target detection
QT连载4:基于QT和STM32H750的LORA试验平台(3)
干货 | 什么是FOC?一文带你看BLDC电机驱动芯片及解决方案