又经过两年的开发,关于this的问题在日常工作中用到的真不多,但是面试还是老生常谈,再次整理笔记,重新来认识this,因为this是和执行上下文绑定的,执行上下文分为三种:全局执行上下文、函数执行上下文、eval执行上下文,所以我们把this分为:全局执行上下文中的this、函数中的this和eval中的this。

    • 全局执行上下文中的this
      • 浏览器中全局对象: window
      • node中全局对象: global

    在浏览器控制台打印console.log(this);得到的结果就是window。

    • 函数中的this (下面只讨论浏览器环境,非严格模式)

      • 默认直接调用一个函数,在函数中的this为window。
      • 通过call、bind、apply改变执行上下文中this的指向(显式绑定)。
      • 通过对象调用其内部的方法,函数中this指向对象本身(隐式绑定)。
      • 构造函数中this就是对象本身。
      • 箭头函数比较特殊,没有自己的this,继承上一层函数的,其实在外部函数中设置self和使用箭头函数原理是一致的。
    • eval中的this (不太常用,略)

    练手来啦:

    1. // 隐式绑定失效,当函数作为参数(即引用)的时候,丢失this。
    2. const obj1 = {
    3. a: 1,
    4. fn: function() {
    5. console.log(this.a)
    6. }
    7. }
    8. const fn1 = obj1.fn // 将引用给了 fn1
    9. fn1()
    10. function run(fn) {
    11. fn()
    12. }
    13. run(obj1.fn)
    14. // 一般匿名函数的this也是全局对象 ,或者IIFE
    15. var name = 'The Window';
    16. var obj = {
    17. name: 'My obj',
    18. getName: function() {
    19. return function() { // 这是一个匿名函数
    20. console.log(this.name)
    21. };
    22. }
    23. }
    24. obj.getName()()