1.1 使用new声明的构造函数,内部顶层this会指向新创建的实例,例子如下:
var a = 1;
a = 2;
window.a = 3;
function Test() {
console.log("this", this) // 指向新创建的实例
let a = 4;
this.a = 5;
setTimeout(function () {
console.log(a);
}, 10);
setTimeout(function () {
console.log(this.a); // 常规setTimeout函数的回调函数,this会指向window
}, 20);
setTimeout(() => {
console.log(a);
}, 30);
setTimeout(() => {
console.log(this.a);
console.log("this", this) // 打印Test {a: 5}(箭头函数本身没有this,this会继承父级上下文,父级上下文this指向新创建的实例)
}, 40);
}
let t = new Test(); // 打印:4 3 4 5
console.log('构造函数t.a', t.a); // 5
1.2 作为普通函数执行时,函数内部的顶层this会指向window(非严格模式下)
var b = 1;
b = 2;
window.b = 3;
function test() {
// 'use strict' // 注意:use strict严格模式时,this指向undefined
console.log("this", this) // 指向window
let b = 4;
this.b = 5; // 因为this指向了window,所以会把外层函数b的值替换为5,此时window对象的b属性值为5
setTimeout(function () {
console.log(b);
}, 10);
setTimeout(function () {
console.log(this.b); // 常规setTimeout函数的回调函数,this会指向window
}, 20);
setTimeout(() => {
console.log(b);
}, 30);
setTimeout(() => {
console.log("this", this) // 打印window(箭头函数本身没有this,this会继承父级上下文,父级上下文this也是指向window)
console.log(this.b);
}, 40);
}
test() // 4 5 4 5