No.
А потому, что ты путаешь две вещи:
аргументы функции являются локальными по отношению к функции (с большой «если», сохраненный для номера 2)
Они предназначены для псевдонима объекта (включая массивы/функции) или значения для области действия под любым именем, которое вы выберете.
Цель состоит в том, чтобы вы могли переименовать свой параметр во все, что хотите, для того, чтобы сделать внутренний код понятным, независимо от того, что вы передаете в качестве аргумента из внешнего кода.
Это не имеет никакого отношения к сфере применения.
переменные в JS передаются по ссылке, если они являются объектами, и по значению, если они являются скалярами.
Всего смыслом прохождения i
в новое закрытия является то, что значения из i
в настоящее время передаются в качестве аргумента, а не ссылки к i
, что и происходит, если вы Дона» t включают в себя закрытие.
Если вы должны были передать объект, и объект был то, что было i
на нем (obj.i += 1
), а затем снова, закрытие или нет, каждая функция будет указывать на ту же ценность i
, потому что они d все используют одну и ту же ссылку на один и тот же объект.
объекты передаются по ссылки, скаляров передаются по значения.
Несмотря на то, что объекты с целыми и числовыми объектами технически являются, они преобразуются в скалярные значения, как только вы ничего не делаете объектно-ориентированными с ними.
var i = 3,
say_i = function() { console.log(i); };
против
var i = 3,
say_i = (function (val) { return function() { console.log(val); }(i));
Первый дает , присвоенный к i
.
Когда запускается say_i
, он смотрит на значение i
в режиме реального времени и плюет на консоль.
Второй прошло значения по к внешней области видимости возвращенной функции, псевдоним в качестве имени val
.
Поскольку числа передаются по значению, а не по ссылке, val
всегда будет одинаковым, если не будет изменено изнутри.
Вы также могли бы достичь этого же результата, если вы сделали функцию один раз, вне цикла:
var add_log = function (el, val) { el.onclick = function() { console.log(val); }; },
i = 0,
el;
for (; i < ........) {
el = ....
add_log(el, i);
}
i
в настоящее время передается по значению, поэтому все элементы будут иметь в своей области видимости таблицы другой val
, поэтому каждый элемент будет записывать другое число.
Аргумент num никогда не обновляется, это новая переменная для каждого вызова. – bfavaretto