首页 > 试题广场 >

箭头函数中this指向举例

[问答题]

箭头函数中this指向举例

  • 首先,在全局作用域下,调用函数的对象是window(以下测试环境均是浏览器)
/* 例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);
例3 中fun函数等价于
var fun = function(){
    console.log('a+b:', this.a + b);
}
等价前,this.a = a中a等于1,并且由于函数的调用方式是自调用,所以函数的调用者应该是window,也就表示第三行的this.a其实就等价于window.a。
等价过后的函数,我们知道这个函数在全局作用域中被调用,所以调用者也是window,那么console.log中的this.a依旧是等价于window.a,所以最终会打印2
/* 例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来调用的
  • 箭头函数没有自己的this,当在内部使用this时,它会指向最近一层作用域内的this
/* 例5 */
var name = '泰罗';
var obj = {
    name: '光太郎',
    This: this,  /* Window */
    sayName: function(){
        console.log(this);  /* {name: '光太郎...'} */
        return () => {
            console.log(this.name); /* 光太郎 */
        }
    }
}
obj.sayName()();
最近一层作用域的this我已经打印出来,看完打印的结果,我想大家就明白为什么输出的是光太郎。
如果将箭头函数this描述为:上一层作用域的this,那打印的必然是window对象上的name属性,结果就一定是泰罗,显然并不是这样。
看完上面这个例子,我想你就会明白,为什么下面的例子打印的结果是泰罗而不是光太郎了:
//例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: '光太郎'}); /* 光太郎 */
我们知道,对于定时器这个宏任务来说,定时器线程完成时间把控后,回调函数最终会交给JS引擎线程去执行,也就是说,回调函数其实就是由window来调用的。所以第一种方式,定时器回调内的this自然就指向了window。
如果用上了箭头函数,前面我们说了,箭头函数的this取决于最近一层作用域的this,最近一层作用域就是arrayDelay的函数体,而函数体的this我们通过call转化为了一个自定义的对象
  • 构造函数中,我们都知道this指向实例化的对象,但是,如果设定了返回值,而且返回值是引用类型,那么实例化的对象就指向这个返回的引用类型的变量
/* 例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);  /* 光太郎 */
  • 在构造函数中,new一个对象都发生了什么?
首先,为这个对象先创建一个空对象,然后自动调用apply方法,将this指向这个空对象,然后函数内的this就被这个空对象代替了。


【JavaScript 中的 this 究竟指向谁,箭头函数的 this 有什么不同_Latency の 博客-CSDN博客_箭头函数的this指向谁】

https://blog.csdn.net/latency_cheng/article/details/80022066


编辑于 2023-11-06 18:23:19 回复(0)
看的我真是一脸懵
发表于 2022-09-09 14:35:27 回复(0)
<p>普通函数的this指向是指向调用它的对象,而箭头函数的this指向是在定义函数的时候绑定的</p>
发表于 2020-06-06 12:53:46 回复(0)