WedX - журнал о программировании и компьютерных науках

«это» различное поведение в узле и v8 chrome

У меня есть:

function MyFunc() {
  this.myString = "wooooo";
  setTimeout(function () {
    console.log("printing this.myString", this.myString);
  }, 1000);
}

MyFunc();

Если я запущу этот внутренний узел, я получу ответ: printing this.myString undefined (кстати, node --version gives v12.16.2)

Если я попробую это в своих консольных инструментах разработки в браузере Chrome, я получу printing this.myString wooooo (кстати, у меня chrome 89.0.4389.90)

Может ли кто-нибудь объяснить мне, почему это отличается в nodejs и js? Почему у него другое поведение?

Спасибо

21.03.2021

  • Это также происходит в node 15.5.1. Я не думаю, что это проблема V8, поскольку и узел, и хром используют движок v8. 21.03.2021
  • Похоже, это потому, что this внутри обработчика времени ожидания ссылается на экземпляр nodejs.org/api/timers. .html#timers_class_timeout . Я не смог найти ничего в спецификации о том, на что this должен ссылаться в обработчике тайм-аута, поэтому я предполагаю, что решает среда хоста. Браузеры не устанавливают конкретное значение this, и Node, похоже, устанавливает указанное значение. 21.03.2021
  • На самом деле я пробовал это руководство: youtube.com/watch?v=gigtS_5KOqo&t=335s 21.03.2021

Ответы:


1

На первый взгляд, обе ссылки на this должны относиться к глобальному объекту (при нестрогом режиме), поскольку обе ссылки встречаются в обычных функциях.

Вот что происходит в браузере.

Однако, если вы действительно зарегистрируете значение this, вы увидите, что оно относится к экземпляру Timeout< /a> в узле:

Timeout {
  _idleTimeout: 1000,
  _idlePrev: null,
  _idleNext: null,
  _idleStart: 21,
  _onTimeout: [Function (anonymous)],
  _timerArgs: undefined,
  _repeat: null,
  _destroyed: false,
  [Symbol(refed)]: true,
  [Symbol(kHasPrimitive)]: false,
  [Symbol(asyncId)]: 5,
  [Symbol(triggerId)]: 1
}

Вполне возможно, что официально не определено, на что this должно ссылаться в обработчике, поэтому среды могут делать в этом отношении все, что хотят.

21.03.2021
  • Кажется, здесь он определен как window: html.spec.whatwg.org/multipage/. Хотя никто не говорит, что узел должен следовать стандарту DOM. 21.03.2021
  • @georg: А, и в шаге 7.2 также говорится: Использовать прокси контекста метода в качестве обратного вызова этого значения.... Я искал неправильные ключевые слова. Но да, я думаю, Node предоставляет реализацию setTimeout просто для удобства, а не для следования спецификации DOM. 22.03.2021
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]