不。
而且因为您混淆了几件事:
函数参数是函数的本地参数(带有一个大的“除非”,为数字 2 保存)
它们旨在将对象(包括数组/函数)或值别名到函数的范围,无论您选择什么名称。
目标是允许您将参数重命名为您想要的任何内容,以使内部代码有意义,无论您从外部代码作为参数传入什么。
这与范围无关。
JS 中的变量如果是对象则通过引用传递,如果是标量则通过值传递。
传递i
到新闭包的全部意义在于将 的值作为i
参数传递,而不是对 的引用,i
如果不包含闭包,就会发生这种情况。
如果你要传递一个对象,而该对象就是i
上面有 (.obj.i += 1
i
对象通过引用传递,标量通过值传递。
即使在技术上存在字符串和数字对象,只要您不直接对它们进行任何面向对象的操作,它们就会被转换为标量值。
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
实时查看 的值,并将其输出到控制台中。
第二个将一个值传递给返回函数的外部作用域,别名为 name 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
在其范围表中都有不同的值,因此,每个元素都会记录不同的数字。