犹豫两秒要不要整理this,从红皮书上看了半天,没搞懂哎(弱爆了)
什么是this?
this是在执行上下文创建时期创建的一个执行过程中不可改变的变量。
执行上下文是指js引擎会将代码执行前需要的变量this提前声明好保存在变量对象中的过程,作用域链也保存在这样类似数组的形式存储在函数中的scope属性中。
this之所以有多变性是因为this只在创建阶段调用,执行上下文创建阶段复制。
this在不同情况下的指向不同
1、严格模式下
this的指向是undefine
2、非严格模式下,this指向的是window,当obj在全局声明的时候,内部的this指向全局对象,当obj在一个函数中声明的时候(也就是作为纯函数),严格模式下this会指向undefine,非严格模式会自动转为全局对象。
3、作为对象的用法this等于那个对象,指向调用对象
var a = 1;
var obj = {
a: 2,
b: function() {
return this.a;
}
}
console.log(obj.b())//2
分析:定义了一个全局变量,然后定义了一个对象,会返回一个字符串,调用的是obj的b方法,所以返回的是2
var a = 1; var obj = {
a: 2, b: function() { return this.a; } } var t = obj.b; console.log(t());//1
分析:调用obj.b()时会立即返回一个字符串,只能找到 var = 1
4、call、apply、bind会将this绑定给对象,可以改变this的指向
5、构造函数
函数和new关键词一起使用时,我们称函数为构造函数,首字母大写(化成灰老子也认识你),this指向新创建出来的对象。
6、箭头函数
不能用call和apply,会捕获其上下文的this值,在创建的时候就已经绑定
7、定时器中的this指向的是window
总结
关于this万变不离其宗,this永远指向正在执行的函数或者对象