en.javascript.info icon indicating copy to clipboard operation
en.javascript.info copied to clipboard

The arrow function.... The lookup of this is made exactly the same way as a regular variable search: in the outer lexical environment.

Open prad3811 opened this issue 3 years ago • 1 comments
trafficstars

I have tried to test this, i believe arrow function doesn't look up for 'this', in the outer lexical environment, it remembers the 'this' of the place where it is defined. In the below code: arrow function is passed to another function and that function calls the arrow function at line //. At line // 'this' is 'window', so if arrow function looks up for this in outer lexical environment, then 'this' should be window object, not cl_Test. Hence, i believe the statement put by you in arrow functions revisited should be changed. Please correct me if i am wrong.

    function cl_Test() {
        // let name = 'Pradeep';
        this.name = 'Pradeep';
        this.age = '31';

        this.arrowF = () => {
            console.log(`${this.name + ' ' + this.age}`);
        };
        this.normalF = function () {
            console.log(name)
        };
        this.arrowF2 = () => {
            console.log(name);
        }
    };

    function fTest(f1) {
        f1();                                                                                              // **
    };

    let o1 = new cl_Test();
    o1.name = 'Sunil';
    o1.age = '34';

    fTest(o1.arrowF);                                                                                  //*
    fTest(o1.normalF);
    fTest(o1.arrowF2);

prad3811 avatar Jan 07 '22 07:01 prad3811

Hi @prad3811 , not sure if I fully got your argument. Maybe you can detail out to which part in the documentation you refer to.

According to the ECMA specification for ArrowFunctions following is stated:

An ArrowFunction does not define local bindings for arguments, super, this, or new.target. Any reference to arguments, super, this, or new.target within an ArrowFunction must resolve to a binding in a lexically enclosing environment. Typically this will be the Function Environment of an immediately enclosing function. ...

For me also your example works as expected.

joachimklug avatar Jan 20 '22 23:01 joachimklug