Почему в старых версиях разработчиков JavaScript это упоминается как _this

Я сейчас читаю машинописный текст. Он конвертирует современный ES21 в более старые версии. Мне интересно, почему именно так, я имею в виду, почему разработчики создавали целую переменную _this и устанавливали ее в ключевое слово this. Как будто проще просто поставить this вместо того, чтобы создавать новую переменную ... Есть идеи?

Ввод (TypeScript)

const Singleton = () => {
  
  if (Singleton._instance) return Singleton._instance;

  Singleton._instance = this;

  return this;
};

const a = new Singleton();
const b = new Singleton();

console.log(a === b);

Вывод (JavaScript)

// BUT WHY ?
var _this = this;

var Singleton = function () {
    if (Singleton._instance)
        return Singleton._instance;
    Singleton._instance = _this;
    return _this;
};
var a = new Singleton();
var b = new Singleton();
console.log(a === b);


person user15328189    schedule 11.03.2021    source источник
comment
Поскольку работает ключевое слово this, его значение не статично, а определяется при вызове время. Если вы хотите использовать правильный this, вам нужно чтобы захватить это.   -  person VLAZ    schedule 11.03.2021
comment
Этот шаблон синглтона выглядит неправильно .. const Singleton = () => { Не будет this, он будет таким же, как globalThis или window в старых деньгах .. Он действительно должен быть const Singleton = function () {, чтобы он был действительным. IOW: console.log(a === b); Эквивалент window === window, и, конечно же, это так.   -  person Keith    schedule 11.03.2021
comment
@VLAZ Его проблема не в захвате this, а в том, что он его даже не получает .. `() =› {} `` ,, нет this   -  person Keith    schedule 11.03.2021
comment
@Keith, я бы сказал, что с этим синглтоном много чего не так. Однако я так понимаю, что это вопрос о том, почему _this существует, где код является скорее иллюстрацией.   -  person VLAZ    schedule 11.03.2021
comment
Точно! Вот что я хотел услышать! Стрелочная функция не имеет собственного this. Прекрасная работа!   -  person user15328189    schedule 11.03.2021
comment
@VLAZ Что не так с моим одноэлементным шаблоном? Как будто это дает мне то, что я хочу. Что бы вы там изменили?   -  person user15328189    schedule 11.03.2021
comment
1. У вас есть общедоступное статическое свойство, открывающее доступ к экземпляру, поэтому любой может свободно манипулировать им. Это даже не readonly, хотя должно быть на самом деле private, 2. Говоря о свойствах, это должен быть класс, а не функция. 3. С появлением модулей шаблон singleton в значительной степени устарел. Просто используйте export const instance = new Singleton();, и вам действительно не нужно когда-либо вызывать new. Весь импорт будет таким же. 4. Даже без модулей или классов это мог бы быть IIFE, который создает и хранит экземпляр.   -  person VLAZ    schedule 11.03.2021
comment
Чтобы добавить в список @VLAZ: № 3. Вы создаете объект в каждом месте, где вы обращаетесь к этому синглтону (кроме первого), который немедленно удаляется. Это не сильно сказывается на производительности памяти, но, как уже упоминалось, синглтоны очень легко сделать с модулями, и это было бы лучше.   -  person Keith    schedule 11.03.2021
comment
@VLAZ. Да, я согласен, что лучше сохранить собственность _instance в тайне. кстати, если я не ошибаюсь, JS не поддерживает частные вещи, # я не использую сейчас, но, возможно ... А что насчет того, чтобы я просто создал свойство только для чтения, как вы сказали, используя Object.createProperty()?   -  person user15328189    schedule 11.03.2021
comment
JS doesn't support private stuff Есть много способов делать частные вещи в JS. Возьмите это - ›var x = (function () { var private = 'hello'; return () => console.log(private); })() Здесь нет доступа к private, еще один вариант для приватного в современном JS - это также WeakMap   -  person Keith    schedule 11.03.2021
comment
@Keith Спасибо, что помогли мне!   -  person user15328189    schedule 11.03.2021
comment
JS не поддерживает личные данные, если я не ошибаюсь, но вы пишете код TypeScript. У вас может быть модификатор доступа в TS.   -  person VLAZ    schedule 12.03.2021