箭头函数中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