美文网首页
浅谈普通函数中的this、箭头函数中的this以及setTime

浅谈普通函数中的this、箭头函数中的this以及setTime

作者: 小龙虾Julian | 来源:发表于2020-04-14 17:58 被阅读0次
一、普通函数中的this

1、总是指向它的直接调用者,如:obj.fn,fn里的最外层this就指向obj
2、默认情况下(不设置'use strict'),没有直接调用者,this指向window
3、严格模式下(设置'use strict'),this指向undefined
4、当时用call、apply、bind绑定时,this指向绑定对象

补充说明:
(1)call()、apply()方法中,第一个参数均是this的指向,当第一个参数为null、undefined时,默认指向window
(2)bind ()方法和 call() 方法类似,第一个参数是this的指向,从第二个参数开始是接收的参数列表。区别在于bind方法返回值是函数以及bind接收的参数列表的使用

二、setTimeout函数中的this

setTimeout的第一个参数是一个方法/代码串,传入到这个方法内部的this会被改写指向window(记住就行!)

三、箭头函数中的this

1、箭头函数内部的this会指向声明箭头函数时所在作用域(就简单理解为一个函数吧,虽然不太准确)的this,偶尔没有上下文时,this指向window
2、即使call()、apply()、bind()方法也不能改变箭头函数ths的指向

四、实例

1、hello是全局函数,没有直接调用它的对象,也没有使用严格模式,因此this指向window

function hello() { 
        console.log(this);  // window 
}  
hello();

2、hello是全局函数,没有直接调用它的对象,使用了严格模式,因此this指向undefined

function hello() { 
        'use strict';
        console.log(this);  // undefined
}  
hello();

3、hello的直接调用者是obj,因此第一个this指向obj;setTimeout函数中的匿名函数没有直接调用者,因此this指向window

const obj = {
    num: 10,
    hello: function () {
        console.log(this);    // obj
        setTimeout(function () {
            console.log(this);    // window
        });
    }    
}
obj.hello();

4、hello的直接调用者是obj,因此第一个this指向obj;setTimeout箭头函数,this指向最近的函数(它的最近的函数就是setTimeout本身)的this指向,因此this指向也是obj

const obj = {
    num: 10,
    hello: function () {
        console.log(this);    // obj
        setTimeout(() => {
            console.log(this);    // obj
        });
    }    
}
obj.hello();

5、diameter是普通函数,它的直接调用者是obj,因此this指向obj;perimeter是箭头函数,this应该指向上下文函数的this指向,但是这里没有上下文函数对象,就默认为window,而window里边没有radius属性,因此返回值为NaN

const obj = {
    radius: 10,  
    diameter() {    
        return this.radius * 2
    },  
    perimeter: () => 2 * Math.PI * this.radius
}
console.log(obj.diameter())    // 20
console.log(obj.perimeter())    // NaN
五、总结(如有不严谨的地方请指正)

1、首先判断函数是普通函数、setTimeout函数还是箭头函数,是什么函数就按照什么函数的方式走
2、如果是普通函数,再判断是否有直接调用者,有的话就this指向直接调用者
3、setTimeout函数中如果是一个普通函数(无论默认情况还是严格模式),则this都是指向window(因为:传入到这个方法内部的this会被改写指向)
4、setTimeout函数中是一个箭头函数,this指向最近的函数的this的指向
5、凡是箭头函数内部的this均会指向声明箭头函数时所在作用域的this

相关文章

  • 浅谈普通函数中的this、箭头函数中的this以及setTime

    一、普通函数中的this 1、总是指向它的直接调用者,如:obj.fn,fn里的最外层this就指向obj2、默认...

  • 常见前端面试题

    箭头函数与普通函数的区别 箭头函数语法比普通函数更加简洁,但箭头函数中没有arguments,所以形参可以使用展开...

  • 函数的this是什么时候绑定的

    箭头函数是没有this的,箭头函数中的this只取决于包裹箭头函数的第一个普通函数的this。

  • 箭头函数与普通函数的区别

    箭头函数与普通函数的区别,实质是我们是否理解了箭头函数,在我刚开始接触ES6时,印象中的箭头函数与普通函数的区别就...

  • React处理事件响应机制

    一. 箭头函数 1.1 使用箭头函数的优点 1、箭头函数一个重要的好处就是对于this对象指向问题,在普通函数中t...

  • 箭头函数

    二、箭头函数与普通函数的区别 1、语法更加简洁、清晰 从上面的基本语法示例中可以看出,箭头函数的定义要比普通函数定...

  • React Native 关于箭头函数、普通函数与点击事件的调用

    箭头函数 箭头函数一个重要的好处就是对于this对象指向问题,在普通函数中this对象的指向是可变的,所以在普通函...

  • 简单说 JavaScript的箭头函数

    说明箭头函数本质还是函数,我们来看看他与JavaScript中普通函数的区别,先看看写法上的区别。 写箭头函数,我...

  • 九、箭头函数 ------ 2020-04-06

    1、箭头函数的创建: 2、箭头函数中没有arguments 3、箭头函数中没有自己的this

  • 函数的扩展

    函数的扩展 箭头函数和普通函数区别箭头函数没有this对象,箭头函数的里的this始终指向定义时所在对象,普通函数...

网友评论

      本文标题:浅谈普通函数中的this、箭头函数中的this以及setTime

      本文链接:https://www.haomeiwen.com/subject/llitvhtx.html