NodeJS 的this指针解析
话说用了这么久的NodeJS,别问细问this指针的指向问题,还是会有点懵逼,下面来研究下这种情况下的this指针到底指向哪?
文件内this指针
直接上代码,打印出来看看
// 全局this 指向module.exports
console.log(this); // {}
this.num = 2;
console.log(this.num); // 2
console.log(module.exports.num); // 2
console.log(global.num); // undefined
输出结果
{}
2
2
undefined
综上,this指针是指向module.exports的
函数内this指针
// 函数中的this指向的是global对象
function func1() {
this.num = 20;
}
func1();
console.log(global.num); // 20
console.log(this.num); // 2
console.log(num); // 20
输出结果
20
2
20
综上,函数内this指针是指向global的。
题外话,全局定义的变量也是挂在global下面的;
可以全局使用的setTimeout等函数也是挂在global下面的(哈哈哈,有点震惊吧,但是想想又特别有道理,全局函数嘛)
构造函数内的this指针
const func6 = (str) => {
console.log(str + this.num)
}
// 构造函数中 this指向的是它的实例,而不是global
function Demo() {
this.num = 88;
function print(str) {
console.log(str + this.num)
}
print('1: ') // 1: 20
this.print = print;
this.print2 = (str) => {
console.log(str + this.num);
};
this.print2('2: ') // 2: 88
this.print3 = func6;
this.print3('6: ') // 6: 2
}
const obj = new Demo();
obj.print('3: ') // 3: 88
const print = obj.print;
// 调用print时,已经不是在对象obj下面执行了,所以this是global
print('4: ') // 4: 20
const print2 = obj.print2;
// 箭头函数内部的this总是指向定义时所在的对象
print2('5: ') // 5: 88
console.log(obj.num); // 88
console.log(global.num) // 20
console.log(this.num) // 2
输出结果
1: 20
2: 88
6: 2
3: 88
4: 20
5: 88
88
20
2
综上,构造函数内this指针是指向实例对象的,调用对象方法时,this指向这个对象。
函数定义时,this指向是未知的,只有执行的时候才可以明确,在哪执行this指向哪。
print('4: ') 这里print的执行,并没有通过对象obj来调用,所以this不指向global
print2('5: ') 为啥是88呢?this.print3('6: ') 为啥是2呢?
因为箭头函数内部的this总是指向定义时所在的对象,func6 里面的this是module.exports,print2 里面的this是obj