Не работает контекст у стрелочных функций

Рейтинг: 0Ответов: 1Опубликовано: 24.02.2015
var A = {
    name: 'A',
    allCallbacks: [],
    setCallback: function( callback ){
        this.allCallbacks[0] = callback;
    },
    say: function( ){
        this.allCallbacks[0]( );
    }
};

var B = {
    run: function( ){
        A.setCallback( ( ) => this.sayName( ) );
    },
    sayName: function( ){
        console.log('B');
    }
};

B.run();
A.say();

На хабре прочел, что самым главным преимуществом стрелочных функций является связывание контекста. Но код выше этого не подтвердил. Почему?

UPD: 0.1.0
Так я и получаю ошибку -

F:\projects\projects\test\test.js:15
        A.setCallback( ( ) => this.sayName( ) );
                                   ^
TypeError: undefined is not a function
    at Array.<anonymous> (F:\projects\projects\test\test.js:15:36)
    at Object.A.say (F:\projects\projects\test\test.js:9:29)
    at Object.<anonymous> (F:\projects\projects\test\test.js:23:3)
    at Module._compile (module.js:446:26)
    at Object.Module._extensions..js (module.js:464:10)
    at Module.load (module.js:341:32)
    at Function.Module._load (module.js:296:12)
    at Function.Module.runMain (module.js:487:10)
    at startup (node.js:111:16)
    at node.js:799:3

Ответы

▲ 1Принят

Думаю, вы запутали себя своим же примером. Ваш код работает верно и он безусловно подтверждает передачу контекста, в чем вы можете убедиться, сравнив es6 и es5 стиль.

В этом случае:

A.setCallback( ( ) => this.sayName( ) );

this как раз-таки несет в себе контекст объекта B, поэтому вызов функции sayName() возможен. В противном случае, this ссылался бы на глобальный контекст (в случае браузера - window) и вы бы получили ошибку.