Различия в исполнении между WebStorm и консолью - PullRequest
0 голосов
/ 03 июня 2018

При запуске этого кода в WebStorm

function sayNameForAll() {
  console.log(this.name);
}

var person1 = {
  name: "Nick",
  sayName: sayNameForAll
};
var person2 = {
  name: "Greg",
  sayName: sayNameForAll
};

var name = "michael";

person1.sayName();
person2.sayName();

sayNameForAll();

Он печатает следующее

Nick
Greg
undefined

, но при запуске в консоли он печатает

Nick
Greg
Michael 

Чем обусловлена ​​эта разница?

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

В браузере есть объект window, для которого все переменные, созданные скриптами, являются свойством, поэтому в браузере this.name "фактически" window.name, так как this относится к windowв объеме функции.

Теперь WebStorm запускает этот код, как если бы это было приложение NodeJS, это замечательно, так как WebStorm не требует запуска браузера в фоновом режиме и может просто использовать любой интерпретатор узлов в переменной PATH.Но у NodeJS нет объекта window, для которого все переменные являются свойством, поэтому он не может найти this.name.this относится к модулю, который пуст, поскольку вы не находитесь внутри модуля.

0 голосов
/ 03 июня 2018

WebStorm запускает код в nodejs.Глобальный контекст (this) относится к модулю и является пустым объектом, поэтому свойство "name" не определено.

Если вы запускаете этот код в браузере, глобальный контекст (который в данном случае равен window) иглобальная область видимости несколько смешана из-за устаревших причин.

Это две разные среды.Вы можете добавить «использовать строгий» в начале, чтобы ваш код вел себя более предсказуемо, но все же будут некоторые различия.

...