глобальный объект, не работающий в коде Visual Studio [JavaScript] [дубликат]

Нет, статические методы не связаны с экземпляром; они принадлежат классу. Статические методы - ваш второй пример; методы экземпляра являются первыми.

29
задан skerit 14 March 2013 в 11:58
поделиться

4 ответа

В отличие от браузера, где переменные по умолчанию назначаются глобальному пространству (то есть окну), переменные узла привязаны к модулю (файлу) , если вы явно не назначили их module.exports .

На самом деле, когда вы запускаете node myfile.js или require('somefile.js'), код в вашем файле завернут следующим образом:

(function (exports, require, module, __filename, __dirname) {
     // your code is here
});
55
ответ дан Daniel Griscom 20 August 2018 в 12:51
поделиться

Все остальные ответы на 100% правильны, но я думал, что добавлю расширенный / окончательный список областей в приложении Node.js, если кто-нибудь встретит это через Google, начиная с изучения Node.js или JavaScript:

Глобальная область действия

Все, что объявлено без ключевого слова var в любом файле, будет доступно из любого места в одном экземпляре сервера узла:

// foo.js
bar = 'baz';


// qux.js
console.log(bar); // prints 'baz'

Обратите внимание, что это считается плохой идеей, потому что это приложение сильно «связано» - это означает, что вам нужно будет открыть foo.js, чтобы выяснить, почему bar = 'baz' в qux.js

Масштаб модуля

Все, что объявлено с ключевым словом var на верхнем уровне (не внутри функции или объекта или любого другого блока) файла node.js, находится в области модуля и будет быть доступным из любого места внутри одного и того же файла, но больше не будет существовать:

// foo.js
var bar = 'baz';
console.log(bar); // prints 'baz'


// qux.js
console.log(bar); // prints 'undefined'

Область функций

Все, что объявлено с помощью ключевого слова var внутри функции, будет доступно только from withi n эта функция, а не нигде:

// foo.js
function myFunction() {
  var bar = 'baz';
  console.log(bar); // prints 'baz'
}

function myOtherFunction() {
  console.log(bar); // prints 'undefined'
}



// qux.js
console.log(bar); // prints 'undefined'

JavaScript - это функция с областью действия . В отличие от других языков [ block scoped ), переменные, объявленные в блоке внутри функции , доступны из любой другой части этой родительской функции . Например, это означает, что если вы объявляете новую переменную внутри цикла, она также доступна вне этого цикла, если вы все еще находитесь внутри родительской функции:

function myFunction() {
  while (thing === true) {
  var bar = 'baz';
  thing = false;
  }
  console.log(bar); // prints 'baz'
}

Shadowing

Если вы обновляете существующую переменную, например используйте ключевое слово var с именем переменной, которое уже было использовано, тогда значение, связанное с этим именем переменной, будет перезаписано в пределах области действия нового объявления :

var bar = 'foo';
console.log(bar) // prints 'foo'

function myFunction() {
  var bar = 'baz';
  console.log(bar);
}
myFunction(); // prints 'baz'
console.log(bar) // prints 'foo'
40
ответ дан Community 20 August 2018 в 12:51
поделиться
  • 1
    +1, потому что я полностью натолкнулся на это через Google, начиная с изучения Node.js или JavaScript. – Jason C 8 December 2016 в 14:08
  • 2
    Это отличное описание области переменных в Node.js – Steve 16 February 2017 в 23:32
  • 3
    Отличный ответ! Как насчет использования декларативных ключевых слов, отличных от var, например const, let или function? – pejalo 24 May 2017 в 20:07
  • 4
    Есть ли объект для представления области видимости модуля? Я хочу получить доступ к переменной области модуля через переменную, содержащую ее имя, возможно ли это? – Cleivson Arruda 14 August 2017 в 20:35
  • 5
    @CleivsonArruda хорошо, нет возможности напрямую обращаться к области модуля. Вот соответствующая спецификация: tc39.github.io/ecma262/#sec-lexical-environments – loadaverage 20 May 2018 в 22:43

Довольно старый вопрос, и если кто-то интересуется спецификациями ECMA по этому вопросу, вот ссылка

И нет никакого способа прямого доступа для переменных модуля (кроме для импортированных модулей):

Лексическая среда и среда Значения записи являются чисто спецификационными механизмами и не должны соответствовать какому-либо конкретному артефакту реализации ECMAScript. Программа ECMAScript не может напрямую обращаться к этим значениям или манипулировать ими.

1
ответ дан loadaverage 20 August 2018 в 12:51
поделиться

Узел имеет область видимости модуля, поэтому var abc = '123' в модуле создаст переменную, которая привязана к этому модулю (и, следовательно, доступна только для кода).

См. также http : //nodejs.org/api/globals.html#globals_global

3
ответ дан robertklep 20 August 2018 в 12:51
поделиться
Другие вопросы по тегам:

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