это ключевое слово действует по-разному между NodeJS и Vanila JavaScript - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь узнать о JavaScript лексических ограничениях и замыканиях. Я запустил этот пример, используя Node.js, а затем в браузере и получил 2 разных вывода.

проверено на chrome Version 80.0.3987.149 (Official Build) (64-bit)
и Node v12.16.1

var obj1 = {
        name: "Pulsar",
        bike: function() {
          console.log(this.name);
        }
      }
      var obj2 = { name: "Gixxer", bike: obj1.bike };
      var name = "Ninja";
      var bike = obj1.bike;
      
      bike();           // "Ninja"
      obj1.bike();      // "Pulsar"
      obj2.bike();      // "Gixxer"

Этот фрагмент кода действует по-другому в Vanilla JavaScript. Вывод:

Ninja 
Pulser
Gixxer

и в NodeJS вывод:

undefined
Pulsar
Gixxer

Может кто-нибудь объяснить, пожалуйста?

Ответы [ 2 ]

3 голосов
/ 05 апреля 2020

В браузерах область верхнего уровня является глобальной областью действия. Это означает, что когда вы определяете что-то с помощью var, оно становится свойством глобального объекта, которым является window.

Итак, bike и name определены в глобальной области, что означает, что они оба являются window свойствами, поэтому this указывает на window и имеет свойство name со значением Ninja.

В узле любая переменная в глобальной области видимости определена в другом локальном модуле, поэтому this bike не связан с переменной name

1 голос
/ 05 апреля 2020

В браузере объект window является глобальным this объектом, и все переменные присваиваются в качестве его свойства. В узле такого объекта нет. Существует this ({}), globalThis и module, но переменные модуля не присваиваются им, а назначаются в памяти.

...