Javascript 数组中的函数

Javascript 数组中的函数,javascript,arrays,function,object,Javascript,Arrays,Function,Object,当值由函数而不是硬编码确定时,我在获取数组中对象的值时遇到了一些问题。 在本例中,我希望迭代数组到console.log,记录我的“stats”对象的值,不返回我在那里拥有的函数,或者将数组中每个对象上的现有函数添加到console.log,再次记录值,而不是函数本身 这里,我的函数返回文本框中的值作为数组中对象“stats”的值。 每次尝试时,它要么返回函数本身作为值,要么返回“null”,要么只返回数组中第一个对象的值 有人能告诉我我错过了什么吗 谢谢 这是我的(完整的HTML)示例代码和我

当值由函数而不是硬编码确定时,我在获取数组中对象的值时遇到了一些问题。 在本例中,我希望迭代数组到console.log,记录我的“stats”对象的值,不返回我在那里拥有的函数,或者将数组中每个对象上的现有函数添加到console.log,再次记录值,而不是函数本身

这里,我的函数返回文本框中的值作为数组中对象“stats”的值。 每次尝试时,它要么返回函数本身作为值,要么返回“null”,要么只返回数组中第一个对象的值

有人能告诉我我错过了什么吗

谢谢

这是我的(完整的HTML)示例代码和我尝试过的“选项”

让用户=[{
姓名:“鲍勃”,
stats:function(){
返回文档.getElementById('option1')。值;
},
代码:“A1”
},
{
姓名:“约翰”,
stats:function(){
返回文档.getElementById('option2')。值;
},
代码:“A2”
},
{
姓名:“卡伦”,
stats:function(){
返回文档.getElementById('option3')。值;
},
代码:“A1”
}
]
/*选择1*/
console.log('firstRun');
users.forEach((user)=>console.log(user.stats));
/*选择2*/
console.log('secondRun');
for(让用户对用户){
console.log(user.stats)
}
/*选择3*/
console.log('thirdRun');
var myArray=users.length;
对于(i=0;i
简单对象/数组单步执行
试试这个

调用函数并修复选项3循环
myArray
实际上是
users.length
重新定义的

让用户=[{
姓名:“鲍勃”,
stats:()=>document.getElementById('option1')。值,
代码:“A1”
},
{
姓名:“约翰”,
stats:()=>document.getElementById('option2')。值,
代码:“A2”
},
{
姓名:“卡伦”,
stats:()=>document.getElementById('option3')。值,
代码:“A1”
},
{
姓名:“史蒂夫”,
stats:()=>document.getElementById('option4')。值,
代码:“A5”
}
]
/*选择1*/
console.log('firstRun');
users.forEach(user=>console.log(user.stats());
/*选择2*/
console.log('secondRun');
for(让用户对用户){
console.log(user.stats())
}
/*选择3*/
console.log('thirdRun');
for(让我输入用户){
console.log(用户[i].stats())
}
/*选择4*/
console.log('forthRun');
for(设i=0;i
简单对象/数组单步执行

必须使用
stats()
运行函数
stats
只返回函数本身。DRY!为什么不一次又一次地存储每个元素的
id
,而不是整个函数呢。只需存储id,并将其用作参数这是否回答了您的问题?另外,请参见。您不是在等待加载DOM。所有选项都不会导致
null
,但它们可能会抛出“
TypeError
:无法读取
null
”的属性“
value
”。请小心最后一个循环
,因为(i=0;i
缺少
let
关键字。这意味着您正在修改全局
i
。for循环还应该使用
myArray[i].stats
(而不是
myArray.stats
)数组本身没有
stats
属性。FWIW存储for循环的长度值是一种众所周知的微优化,它确实会加快代码的速度。因此,删除
myArray
不是修复代码,而是对其进行反优化。TBH我个人不认为大多数人需要它,因为节省的钱很少,但是如果你正在处理数百万个对象,那么这是优化代码的简单的第一步。javascript中的属性访问,如
array.length
有一定的成本,您将看到在高度优化的库中使用了很多
myArray
技巧,如jQueryI尝试了“代码片段”,并在该网页上运行良好。然而,当我把它复制到我的HTML文档中时,它总是给我一个“未捕获的错误…”。我复制/粘贴了你的整个脚本代码和HTML代码,只是为了确保我没有输入错误,它仍然会产生相同的错误。您的代码片段中是否有我遗漏的内容?谢谢。您使用的浏览器和版本是什么?Google Chrome版本84.0.4147.105(官方版本)(64位)如果我删除数组中的所有“.value”,那么它将运行代码,但返回所有“null”值。明显地我还尝试使用“.innerHTML”,但它也返回错误“UncaughtTypeError:无法读取null的属性'value'。