Ответ 1
Предположительно, этот код находится в области верхнего уровня модуля, поэтому он в строгом режиме (по умолчанию для модулей - строгий режим) или файл, который оценивается в строгом режиме (поскольку он имеет "use strict"
или из-за настроек Babel).
Краткая версия. Если вы ожидаете, что this
будет определяться beforeEach
при вызове вашего обратного вызова, вы хотите использовать функцию function
, а не функцию стрелки. Читайте дальше, почему Babel транслирует как есть:
Фундаментальная функция стрелок (кроме краткости) заключается в том, что они наследуют this
из своего контекста (например, переменную, которую они закрывают), вместо того, чтобы установить ее вызывающим. В строгом режиме this
в глобальном масштабе undefined
. Так что Вавилон знает во время компиляции, что this
внутри функции стрелки будет undefined
и оптимизирует его.
Вы сказали в комментариях, что это внутри другой функции, но я предполагаю, что она находится внутри другой функции стрелки, например:
describe(() => {
beforeEach(() => {
this.asd= '123';
// ...
});
});
Так как Бабель знает, что this
есть undefined
в обратном вызове describe
, он также знает, что this
есть undefined
в обратном вызове beforeEach
.
Если вы помещаете свой код в контекст свободного режима или внутри вызова функции, где this
не может быть определено во время компиляции, он этого не сделает. Например, в строгом режиме ваш
beforeEach(() => {
this.asd= '123';
this.sdf= '234';
this.dfg= '345';
this.fgh= '456';
});
действительно переводится на
'use strict';
beforeEach(function () {
undefined.asd = '123';
undefined.sdf = '234';
undefined.dfg = '345';
undefined.fgh = '456';
});
но это:
function foo() {
beforeEach(() => {
this.asd= '123';
this.sdf= '234';
this.dfg= '345';
this.fgh= '456';
});
}
переводит на
'use strict';
function foo() {
var _this = this;
beforeEach(function () {
_this.asd = '123';
_this.sdf = '234';
_this.dfg = '345';
_this.fgh = '456';
});
}
... потому что Бабель не знает, как будет называться foo
, и, следовательно, что this
будет.