箭头函数中this指向举例
/* 例1 */ function a(){ var user = "光太郎"; console.log(this); /* Window(Window表示数据类型,window表示对象,Window类型的window对象) */ console.log(this.user); /* undefined window身上并没有user属性*/ } a(); /* 等效于window.a() */
/* 例2 */ var name = '泰罗'; var obj = { name: '光太郎', sayName: function(){ return function(){ console.log(this.name); /* 泰罗 */ } } } obj.sayName()(); /* 我们知道第一个()是由obj调用的,第二个括号,是由window调用的 */
/* 例3 */ var fun = function (a){ this.a = a; return function(b){ console.log('a+b:', this.a + b); /* 2 */ } }(1); fun(1);
var fun = function(){ console.log('a+b:', this.a + b); }等价前,this.a = a中a等于1,并且由于函数的调用方式是自调用,所以函数的调用者应该是window,也就表示第三行的this.a其实就等价于window.a。
/* 例4 */ var obj = { name: '泰罗', obj2: { name: '光太郎', sayName: function(){ console.log(this); /* Window */ console.log(this.name); /* undefined */ } } } var p = obj.obj2.sayName; p();我们知道p被放在了全局作用域下,所以最终是由window来调用的
/* 例5 */ var name = '泰罗'; var obj = { name: '光太郎', This: this, /* Window */ sayName: function(){ console.log(this); /* {name: '光太郎...'} */ return () => { console.log(this.name); /* 光太郎 */ } } } obj.sayName()();
//例6 var name = '泰罗'; var obj = { name: '光太郎', sayName: () => { console.log('name:', this.name); } } obj.sayName(); /* 泰罗 */再看一个稍微难一点的例子:
/* 例7 */ var name = '泰罗'; function delay(){ setTimeout(function(){ console.log(this.name); }, 100) } function arrowDelay(){ console.log(this); /* {name: 光太郎} */ setTimeout(() => { console.log(this.name); }, 100) } delay.call({name: '光太郎'}); /* 泰罗 */ arrowDelay.call({name: '光太郎'}); /* 光太郎 */
/* 例8 */ /* 返回一个引用类型的数据 */ function fn(){ this.user = '光太郎'; return [1, 2, 3]; } var a = new fn(); console.log(a.user); /* undefined */
/* 例9 */ /* 返回基本类型的数据(外加null) */ function fn(){ this.user = '光太郎'; return 13; } var a = new fn(); console.log(a.user); /* 光太郎 */
https://blog.csdn.net/latency_cheng/article/details/80022066