javascript - 当在单独的循环中定义所述变量时,在循环内调用变量
问题描述
我希望有人——最好是 Jon Skeet,但我会接受凡人的回答——向我解释以下基本的 JavaScript 场景。我有一个类似于以下的功能:
myFunction()
{
var row;
for (var i = 0; i < collectionView.itemsAdded.length; i++)
{
row = this.collectionView.itemsAdded[i];
}
for (var i = 0; i < collectionView.itemsAdded.length; i++)
{
// this always logs as the last value it was given from the first loop. I expected it to give me the same variety of values it gave me in the first loop.
row.property1 = true;
}
}
出乎意料的是,第二次使用row
总是导致第一个 for 循环给出的最终值。即如果collectionView.itemsAdded.length
是 45,row
将记录为 44(bc 零索引)并在 second 的每次迭代中保持 44 loop
。
我错误地期望row
在第二个中调用for loop
就足以给row
我在第一个中给我的相同结果for loop
。我认为对于 second 的每次迭代loop
,row
都会将其记录为不同的项目-相反,它会记录每次this.collectionView.itemsAdded[44]
从第一个循环获得的记录。
在我的脑海里,我明白了。但是谁能进一步解释这里发生了什么?如果应该是行this.collectionView.itemsAdded[i]
- 为什么它不能转移到另一个循环?如果我想要相同的值,为什么必须row = this.collectionView.itemsAdded[i]
在第二个中再次声明?for loop
解决方案
row
只是持有一个对象的引用。在第一个循环中,它不断变化。循环结束后,row
不会更新 的值。因此,在第二个循环中,操作是在同一个对象上完成的,即分配给行的最后一个值。
推荐阅读
- sql - 等于一是什么意思 - ISNULL (something, 1) = 1
- ios - 在标签栏中重新加载视图控制器
- c# - Api 控制器的单元测试
- html - 为什么我预览时只能得到一个非常窄的pdf框
- c# - 分层列表C#上的编号项目
- excel - VBA快速复制行
- libgdx - 找不到 org.jetbrains.trove4j:trove4j:20160824
- mdriven - MDriven Save OR Mappings to Database
- selenium - How do deselect a particular SELECT option in a non multi-select selenium
- html - 要求最低的 HTML 密码模式