this全面解析<转>
2024-10-07 00:58:26
先搞明白一个很重要的概念 —— this的值是在执行的时候才能确认,定义的时候不能确认!
为什么呢 —— 因为this是执行上下文环境的一部分,而执行上下文需要在代码执行之前确定,而不是定义的时候。
看如下例子:
// 情况1
function foo() {
console.log(this.a) //1
}
var a = 1
foo(); // 情况2
function fn() {
console.log(this);
}
var obj = { fn: fn };
obj.fn(); //this->obj // 情况3
function CreateJsPerson(name, age) {
//this是当前类的一个实例p1
this.name = name; //=>p1.name=name
this.age = age; //=>p1.age=age
}
var p1 = new CreateJsPerson("尹华芝", 48); // 情况4
function add(c, d) {
return this.a + this.b + c + d;
}
var o = { a: 1, b: 3 };
add.call(o, 5, 7); // 1 + 3 + 5 + 7 = 16
add.apply(o, [10, 20]); // 1 + 3 + 10 + 20 = 34 // 情况5
<button id="btn1">箭头函数 this</button>
<script type="text/javascript">
let btn1 = document.getElementById('btn1');
let obj = {
name: 'kobe',
age: 39 ,
getName: function() {
btn1.onclick = () => {
console.log(this); //obj
};
}
};
obj.getName ();
</script>
接下来我们逐一解释上面几种情况
对于直接调用 foo 来说,不管 foo 函数被放在了什么地方,this 一定是 window
对于 obj.foo() 来说,我们只需要记住,谁调用了函数,谁就是 this,所以在这个场景下 foo 函数中的 this 就是 obj 对象
在构造函数模式中,类中(函数体中)出现的this.xxx=xxx中的this是当前类的一个实例
call、apply和bind:this 是第一个参数
箭头函数this指向:箭头函数没有自己的this,看其外层的是否有函数,如果有,外层函数的this就是内部箭头函数的this,如果没有,则this是window。
注:首先,new
的方式优先级最高,接下来是 bind
这些函数,然后是 obj.foo()
这种调用方式,最后是 foo
这种调用方式,同时,箭头函数的 this
一旦被绑定,就不会再被任何方式所改变。
注:转自前端工匠
地址:https://mp.weixin.qq.com/s/WfEOY57Trq6JD1CO2VSYWA
最新文章
- Day 1:学习Windows Phone 使用 SQLite
- Javabean+servlet+JSP(html)实例应用
- CentOS7 续
- SSH原理与运用
- Linux操作系统shell与函数详解
- python 建立网站
- Mongodb 3.0 创建用户
- IIS 配置
- [置顶] C++学习书单
- 普通的年轻状态机,纯C语言
- EmitMapper 和TinyMapper 两者简单对比
- Python中ValueError: invalid literal for int() with base 10 的实用解决办法
- 学HTTP协议所要知道的基础知识(微总结)
- spider 爬虫文件基本参数(3)
- 了解Linux操作系统发展阶段
- Java学习笔记53(网络编程:TCP协议案例)
- 软件工程项目之摄影App(总结)
- leetcode-algorithms-13 Roman to Integer
- 利用redis完成自动补全搜索功能(二)
- Laravel 中使用原生的 PHPExcel
热门文章
- 一、Vue基础之常用方法
- python - 技术提高要点之一,函数式编程,性能,测试和编码规范
- 网络通信框架之volley
- 代码实现:键盘录入一个int类型的整数,对其求二进制表现形式
- 【例3】设有关系模式R(A, B, C, D, E)与它的函数依赖集F={A→BC, CD→E, B→D, E→A},求R的所有候选键。 解题思路:
- tensorflow分布式运行
- php中应用memcached
- linux常用命令(17)find命令概览
- eclipse下写html
- 【MFC】BitBlt详解