функция (с переменной) -> функция -> жирная стрелка функция-> переменная из первой функции, показанная здесь? - PullRequest
0 голосов
/ 26 мая 2018

Я узнаю о лексической this передаче, и я понимаю, что жирная стрела получает свое "это" от себя или от функции над ней.Если это обычная функция, я понимаю, что она не получит this от функции выше этой.Например, это код, который, по моему мнению, не должен запускаться:

function test() {
  this.a = 5; // test()' variable
  this.b = function() {
    //this is a fat arrow function so console log below could grab the this from this function's space, but not higher than this, but it does?
    this.c = setTimeout(() => {
      console.log(this.a);
    }, 1000);
  }
}
var d = new test();
d.b();

Так что я ожидаю, что оператор console.log хочет распечатать this.a.Он не существует в контексте функций жирной стрелки, поэтому он поднимается на один уровень выше уровня анонимной функции.Здесь также нет this.a.Это обычная не жирная стрелка, означающая, что лексическая область моего понимания должна здесь остановиться, она не должна подниматься выше, но она есть, и я не уверен, почему.Почему это происходит?

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

read this (каламбур предназначен)

"Когда функция вызывается как метод объекта, ее this устанавливается для объекта, для которого вызывается метод"

Рассмотрим этот упрощенный пример:

"use strict";

var obj = {
  name: "obj",
  a: function() {
    return this
  }
}
var a = obj.a
var obj2 = {
  name: "obj2"
}
obj2.a = a

console.log(
  obj.a(), // => obj
  a(), // => window | undefined (based on strict mode)
  obj2.a() // => obj2
)

Аналогично, в вашем примере вызов d.b() установит this в d внутри b.Внутри вашей функции стрелки этот контекст будет сохранен.

0 голосов
/ 26 мая 2018

Поскольку вы вызываете функцию b как d.b, это this является объектом d.Так что this.a эквивалентно d.a.Как вы уже заметили, функция стрелки будет переносить this из родительской области видимости, поэтому она может разрешить this.a как d.a.

function test() {

  this.a = 5; // test()' variable
  this.b = function() {
    console.log("this.a in b: ", this.a);
  
    this.c = setTimeout(() => {
      console.log("this.a in c: ", this.a);
    }, 1000);
  }
}

var d = new test();
d.b();

Что произойдет, если вы включите d.b в отдельную переменную, а затем вызовете ее?Вы получаете undefined - потому что this внутри b теперь относится к глобальной области действия.

function test() {

  this.a = 5; // test()' variable
  this.b = function() {
    console.log("this.a in b: ", this.a);
    console.log("this === window: ",this === window);
  
    this.c = setTimeout(() => {
      console.log("this.a in c:", this.a);
    }, 1000);
  }
}

var d = new test();
var myNewFunction = d.b;

myNewFunction();
...