NodeJS的this指针解析

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

参考文章:
JavaScript——对this指针的新理解
node.js中this指向失效解决

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值