箭头函数和普通函数的this指向问题
- 箭头函数和function的不同:箭头函数的作用域一直都是定义的作用域,不会改变;function的作用域由调用的时候决定
var obj = { b: 123, fun: function(){ console.log(this.b); } } obj.fun(); //123 let func = obj.fun; func(); //undefined
var obj = { b: 123, fun: ()=>{ console.log(this.b); } } obj.fun(); //undefined let func = obj.fun; func(); //undefined
上面输出undefined的函数中,this指向为window(当定义在全局的时候)
-
全局定义的一个变量,在node环境和浏览器环境下有什么不同
//浏览器环境 var a = 123; console.log(a); //123 console.log(this.a); //123 console.log(window.a); //123
//node环境 console.log(a); //123 console.log(this.a); //undefined console.log(global.a); //undefined
node中的this是一个Object对象。
- 我们知道node中是存在模块化概念的,所以每一个模块里面的作用域包括this都是不公用的,只有global是全局的。(注意我们的方法使用的箭头函数,如果是function的话,那this指向的就是暴露出的num了)
//num.js this.num = 1; module.exports = { num: 0, add: () => { console.log(this); //Object {num: 1} this.num++; //这里的this指向的是?? } }
//main.js const s = require("./num"); this.num=0; s.add(); console.log(this); //Object {num: 0}
执行main.js,调用s.add()函数,里面的this指向就是文件num.js里面的this