@Yaolegol

Что означает стрелочная функция обернутая в круглые скобки? var x = ( () => this )?

Всем привет, подскажите что означает следующая запись:
var x = ( () => this );
увиденная мной при просмотре документации MDN к "this", раздел "Arrow functions"?
Вот сам пример оттуда:

// Create obj with a method bar that returns a function that
// returns its this. The returned function is created as 
// an arrow function, so its this is permanently bound to the
// this of its enclosing function. The value of bar can be set
// in the call, which in turn sets the value of the 
// returned function.
var obj = {
  bar: function() {
    var x = (() => this);
    return x;
  }
};

// Call bar as a method of obj, setting its this to obj
// Assign a reference to the returned function to fn
var fn = obj.bar();

// Call fn without setting this, would normally default
// to the global object or undefined in strict mode
console.log(fn() === obj); // true

// But caution if you reference the method of obj without calling it
var fn2 = obj.bar;
// Calling the arrow function's this from inside the bar method()
// will now return window, because it follows the this from fn2.
console.log(fn2()() == window); // true


По возможности дайте ссылку где можно про это прочитать. Заранее спасибо!
  • Вопрос задан
  • 738 просмотров
Решения вопроса 1
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
ничего не значит.
что со скобками, что без них, без разницы.
Смысл в том, что в переменную x записывается ссылка на функцию
А сама суть примера в том, что стрелочная функция не создает новый контекст, и this будет указывать на ту область, в которой была определена функция.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
BRAGA96
@BRAGA96
Это просто скобки выражения, в этих строках нет разницы
(((((3 + 2)))))
3 + 2


Но есть частые случаи, когда они нужны. Это только то, что сходу вспомнил, случаев на самом деле больше:
(function () {
	// ...
})();

(3).toString();

// a() - return object
const a = () => ({})

// a() - return undefined
const a = () => {}
Ответ написан
IgorPI
@IgorPI
Ну, во-первых, разница как раз большая.

1. Стрелочные функции всегда анонимные
2. Они не имеют собственного контекста
3. Стрелочные функции не могут быть использованы как конструктор
4. Ключевое слово yield не может быть использовано в теле стрелочной функции
5. Стрелочная функция не может содержать разрывы строк между параметрами и стрелкой.
...

Используя стрелочные функции, запись становится короче, но некоторые операции вы обязаны выполнять в классическом слитье, все из-за того же контекста
Ответ написан
Комментировать
@Yaolegol Автор вопроса
Итак, правильный ответ (спасибо Сергей delphinpro Сергей delphinpro):
var x = ( () => this );
и
var x = () => this;


означает одно и тоже.

Кто сомневается - забиваем в codepen:
1. var x = ( () => 5 ); //или var x = ( () => this );
console.log(x);
2. var x = () => 10; //или var x = () => this;
console.log(x);

Получаем:
1. () => 5 //или () => this
2. () => 10 //или () => this
Ссылка на codepen: https://codepen.io/Yaolegol/pen/ExYXOMb

Сами скобки в данном случае означают ссылку на стрелочную функцию. Подробнее тут
Что значит оборачивание функции в скобки (function() { ... })?

Всем спасибо за участие!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы