箭头函数和普通函数的this指向问题

  1. 箭头函数和function的不同:箭头函数的作用域一直都是定义的作用域,不会改变;function的作用域由调用的时候决定
    var obj = {
      b: 123,
      fun: function(){
        console.log(this.b);
      }
    }
    
    obj.fun(); //123
    let func = obj.fun;
    func(); //undefined
    var obj = {
      b: 123,
      fun: ()=>{
        console.log(this.b);
      }
    }
    
    obj.fun(); //undefined
    let func = obj.fun;
    func(); //undefined

    上面输出undefined的函数中,this指向为window(当定义在全局的时候)

  2. 全局定义的一个变量,在node环境和浏览器环境下有什么不同

    //浏览器环境
    var a = 123;
    console.log(a); //123
    console.log(this.a); //123
    console.log(window.a); //123
    //node环境
    console.log(a); //123
    console.log(this.a); //undefined
    console.log(global.a); //undefined

    node中的this是一个Object对象。

  3. 我们知道node中是存在模块化概念的,所以每一个模块里面的作用域包括this都是不公用的,只有global是全局的。(注意我们的方法使用的箭头函数,如果是function的话,那this指向的就是暴露出的num了)
    //num.js
    this.num = 1;
    module.exports = {
        num: 0,
        add: () => {
            console.log(this); //Object {num: 1}
            this.num++;  //这里的this指向的是??
        }
    }
    //main.js
    const s = require("./num");
    
    this.num=0;
    s.add();
    console.log(this); //Object {num: 0}

    执行main.js,调用s.add()函数,里面的this指向就是文件num.js里面的this

posted @ 2019-10-18 15:55  祖国的小花朵  阅读(538)  评论(0编辑  收藏  举报