Скопировано (или присвоено) в вашем втором примере, это всего лишь одна копия переменной j
, и она будет иметь значение, которое у нее было в последней версии, которая будет равна 9 (последний оборот вашего цикла for). Для создания новой копии переменной для каждого оборота цикла for
вам потребуется новое закрытие функции. Второй пример имеет только одну переменную, которая является общей для всех оборотов вашего цикла for
, поэтому может иметь только одно значение.
Я не знаю окончательной записи по этой теме.
Переменные в javascript относятся к уровню функции. В javascript отсутствует область охвата. Таким образом, если вам нужна новая версия переменной для каждого оборота цикла for, вам нужно использовать новую функцию (создание закрытия функции), чтобы каждый раз записывать это новое значение через цикл for
. Без закрытия функции одна переменная будет иметь только одно значение, которое будет общим для всех пользователей этой переменной.
Когда вы объявляете переменную, например, как ваш var j = i;
на каком-то другом месте, чем в начале функции, JavaScript талей определение к верхней части функции и код становится эквивалентно следующему:
var j;
for (var i = 0; i < 10; i++)
{
j = i;
process.nextTick(function()
{
console.log(j)
})
}
Этот называется variable hoisting
и это термин, который вы могли бы использовать Google, если хотите узнать больше об этом. Но дело в том, что существует только область функций, поэтому переменная, объявленная где угодно в функции, фактически объявляется один раз в верхней части функции и затем назначается в любом месте функции.
Это не ясно, почему я не создаю новую область для J – nponeccop
@nponeccop, JavaScript имеет функцию сферы. –
Я ударился головой о стол. Не знал этого, предположил, что это C++ или Perl или Haskell :) Fascinating – nponeccop