эта привязка в функции обратного вызова стрелки - PullRequest
0 голосов
/ 02 августа 2020

Буду признателен за вашу помощь и объяснение. Мне неясно, почему второе и третье оповещения в приведенном ниже коде отличаются от первого.

Стрелочные функции имеют лексическую привязку. Этот бит ясен. Почему включение выражения функции стрелки в качестве параметра в вызове метода объекта имеет значение для "this", которое каким-то образом привязывается к переменной глобального имени.

var name = "globalscope name";

let person = {
    name: 'Tommy',
   
    showName(a){
        let fun1 = ()=>this.name;
        let fun2 = a;
        alert(fun1()); //Tommy - this is behaving as expected base on lexical binding
        alert(a()); // globalscope name - this is not
        alert(fun2()); //globalscope name
    }
}

person.showName(()=>this.name);

Ответы [ 2 ]

1 голос
/ 02 августа 2020

Лексическая привязка this означает, что значение this копируется из того места, где объявлена ​​функция.

Функция, объявленная в последней строке, находится в области видимости, где this равно window .

Функция, объявленная в первой строке showName, находится в области, где this зависит от того, как вызывается showName.

Значение this копируется из области видимости, в которой объявлена ​​функция, а не из того, что было непосредственно перед передачей в функцию, в которой оно было вызвано.

0 голосов
/ 02 августа 2020

В этом блоке кода person.showName(()=>this.name); this.name относится к объекту window, где в объекте окна name значение равно globalscope name

И вы вызываете метод объекта person.showName для который вы просто передаете ссылку на функцию вместе с this.name (window.name), из-за чего a() и fun2() предоставляют результат имя глобальскопа

...