代码之家  ›  专栏  ›  技术社区  ›  totalnoob

在正规函数和箭头函数的上下文中,关于这一点的问题

  •  0
  • totalnoob  · 技术社区  · 8 年前

    从未完全理解箭头函数和正常函数中的词汇作用域

    this.thisGlobalVariable = 200;
    
    function normalFunction() {
        this.thisVariable = 100;
    }
    
    function normalFunctionTwo() {
        console.log(this.thisVariable); // 100
        console.log(this.globalVariable); // undefined
    }
    
    let anonymousArrowFunction = () => {
        console.log(this.thisVariable); // undefined
        console.log(this.thisGlobalVariable); // 200
    
    }
    normalFunctionTwo();
    anonymousArrowFunction();

    既然anonymousArrowFunction是一个arrow函数,它是词法的(它的作用域是创建它的上下文),所以它是全局作用域,因为它能够访问它。这个全球变量?而normalFunction和normalFunctionTwo作为普通函数会在自己的范围内创建自己的函数?normalFunctionTwo如何访问这个。这个在normalFunction中定义的变量?

    3 回复  |  直到 8 年前
        1
  •  1
  •   Nicholas Tower    8 年前

    对于正常函数 this 在调用函数时确定。你在没有任何上下文的情况下调用函数,所以 这 设置为窗口对象(在非严格模式下)。由于所有函数都与同一个窗口对象交互,因此它们可以看到彼此的手工工作(尽管示例代码中存在一些错误,使其无法正常工作)

    还有其他调用函数的方法,它们会导致函数的不同值。例如,假设我将一个函数粘贴到一个对象中,并通过引用该对象来调用它:

    this.val = 'from window';
    
    function doStuff() {
       console.log(this.val);
    }
    
    const myObj = {
      val: 'from object',
      log: doStuff
    }
    
    console.log(doStuff === myObj.log) // <-- they're literally the same function
    doStuff(); // <-- this is set to the window object
    myObj.log(); // <-- this is set to myObj
        2
  •  1
  •   Jonas Wilms    8 年前

    “正常函数”通过调用它们的方式确定它们的上下文,因此:

     context.method();
    

    电话 method 具有 this 指向 context .现在你知道了

     normalFunctionTwo();
    

    在没有任何上下文的情况下调用函数,然后上下文默认为 window 对象所以 这 在…内 normalFunctionTwo (也在它之外)指向 窗 .在这种情况下,箭头功能没有区别。

        3
  •  1
  •   FK82    8 年前

    你误解了怎么做 this 正在确定:引用自 MDN

    在大多数情况下,其价值取决于 函数的调用方式 .在执行过程中不能通过赋值进行设置,每次调用函数时可能会有所不同。ES5引入了bind方法来设置函数this的值,而不管它如何调用,ES2015引入了arrow函数,这些函数不提供自己的this绑定(它保留封闭词法上下文的this值)。

    价值 这 不是由一个 function 你不能直接分配给它。相反 这 正在执行前解决(请参阅 here ).这就是为什么 Function.apply , Function.call 和 Function.bind 存在,可用于明确设置 这 .

    “正常”函数声明和箭头函数声明的区别在于 这 自动绑定到封闭的词法上下文。


    顺便说一句,在你的代码片段中, 这 始终引用全局范围。