На каком объекте находятся функции верхнего уровня, хранящиеся в Node.js? [Дубликат]

В случае ArrayList: remove (int index) - если (индекс - позиция последнего элемента), он избегает без System.arraycopy() и не занимает времени для этого.

Время arraycopy увеличивается, если (индекс уменьшается), кстати, элементы списка также уменьшаются!

лучший эффективный способ удаления - удаление его элементов в порядке убывания: while(list.size()>0)list.remove(list.size()-1); // принимает O (1) while(list.size()>0)list.remove(0); // принимает O (факториал ( n))

//region prepare data
ArrayList<Integer> ints = new ArrayList<Integer>();
ArrayList<Integer> toRemove = new ArrayList<Integer>();
Random rdm = new Random();
long millis;
for (int i = 0; i < 100000; i++) {
    Integer integer = rdm.nextInt();
    ints.add(integer);
}
ArrayList<Integer> intsForIndex = new ArrayList<Integer>(ints);
ArrayList<Integer> intsDescIndex = new ArrayList<Integer>(ints);
ArrayList<Integer> intsIterator = new ArrayList<Integer>(ints);
//endregion

// region for index
millis = System.currentTimeMillis();
for (int i = 0; i < intsForIndex.size(); i++) 
   if (intsForIndex.get(i) % 2 == 0) intsForIndex.remove(i--);
System.out.println(System.currentTimeMillis() - millis);
// endregion

// region for index desc
millis = System.currentTimeMillis();
for (int i = intsDescIndex.size() - 1; i >= 0; i--) 
   if (intsDescIndex.get(i) % 2 == 0) intsDescIndex.remove(i);
System.out.println(System.currentTimeMillis() - millis);
//endregion

// region iterator
millis = System.currentTimeMillis();
for (Iterator<Integer> iterator = intsIterator.iterator(); iterator.hasNext(); )
    if (iterator.next() % 2 == 0) iterator.remove();
System.out.println(System.currentTimeMillis() - millis);
//endregion
  • для индексной петли: 1090 мс
  • для индекса desc: 519 мсек --- лучший
  • для итератора: 1043 мсек
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 19 August 2018 в 04:25
поделиться

Все остальные ответы на 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 19 August 2018 в 04:25
поделиться
  • 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 19 August 2018 в 04:25
поделиться

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

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

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

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