我是javascript的新手,并尝试了解此代码的行为,该代码尝试将唯一的onclick处理程序分配给数组myElements []中的不同DOM元素:
(function handleClicks(){
for (var i = 0; i < 100; ++i) {
myElements[i].onclick = function() {
alert( 'You clicked on: ' + i );
};
})();
我的理解是,每次点击一个DOM元素时,浏览器都会提示“你点击100”,因为一旦功能完成,javascript将使用值 i
我有两个问题:
var myElements = [];
myElements.push( document.getElementById('1');
myElements.push( document.getElementById('2');
myElements.push( document.getElementById('1');
myElements.push( document.getElementById('2');
http://jsfiddle.net/branmong/fS7qE/
但是当程序运行时,它会针对每个单击的元素警告“您点击:2”。
为什么不警告'你点击:100'。因为这肯定是函数运行完毕后的价值吗?
答案 0 :(得分:1)
“如果
i
仅在函数handleClicks()
中具有范围,那么在功能完成后,浏览器如何访问i
- 肯定i
不再存在? “
i
变量位于封闭范围(handleClicks
函数)中。创建函数时,它会携带函数生命周期的原始变量范围。这称为闭合。
因此,在循环中创建的所有处理程序函数都引用了i
中存在的相同handleClicks
变量。这使i
保持活力。当您销毁处理程序时,i
将能够被垃圾收集。
第二个代码示例在2
处停止,因为您获得了 TypeError 来访问undefined
上的属性。这会停止执行代码。
答案 1 :(得分:0)
这是因为myElements数组中只有两个元素。因此,循环仅执行uptil 2并在此之后输出错误。如果添加了5个元素,它将显示5,如果添加100,则显示100。