JavaScript 中出现意外的引用错误
an unexpected references error in javascript
我正在尝试在JavaScript中创建一个由函数组成的数组。我编写了以下代码以确保数组中的每个函数都返回它的位置,但是数组中的每个函数都得到10,任何人都可以解释为什么吗?
function createFunctionArray(){
var result = new Array();
for(i=0;i<10;++i){
result[i] = function(){
var now = i;
return now;
};
}
return result
}
函数执行是延迟的,它返回对i
的引用,而不是它的实际值。 您需要将i
放在闭包中,以创建其值的本地副本。 喜欢这个:
result[i] = (function(i) {
return function(){
var now = i;
return now;
}
})(i);
小提琴
要查看其工作原理,您可以将上述函数提取到命名函数createFunction
:
var createFunction = function(i) {
return function(){
var now = i;
return now;
}
}
像这样简单地使用它:
result[i] = createFunction(i);
小提琴
您的代码:
function createFunctionArray(){
var result = new Array();
for(i=0;i<10;++i){
result[i] = function(){
var now = i;
return now;
};
}
return result
}
调用此函数时。将 i 从 0 循环到 9,并将您创建的那些函数推送到数组中。但是,这些功能从未运行过。当循环在 i = 10 时结束时,您有一个您创建但从未调用的函数数组。所以现在..当您通过结果调用任何一个功能时[.. 说 4]。该函数将设置 var now = i,当前为 10,并返回该值。这是你总是得到 10 的方式。
你正在使用闭包。您应该始终记住的一件事是,闭包通过引用而不是值存储外部变量。因此,所有对i
的引用都将更新为最终值i
即 10。
正确执行此操作的一种可能方法是,
function createFunctionArray(){
var result = new Array();
for(i=0;i<10;++i){
(function(j){
result[j] = function(){
return j;
};
})(i);
}
return result;
}
小提琴链接
相关文章:
- gmaps4rails 2.4.6未捕获引用错误:未定义Gmaps
- Wordpress中的Javascript出现匿名函数/引用错误
- 使用dc.js、d3.js和crossfilter引用错误
- 未捕获引用错误:未定义validateform
- 为什么我会出现此错误"未捕获引用错误:未定义标题;
- $未定义-未捕获引用错误
- Sitecore”;未捕获引用错误:未定义MultilistWithSearch;
- Wordpress:未捕获引用错误:未定义速度
- Node.js引用错误:未定义类名
- 我该如何解决“;未捕获引用错误:谷歌没有定义"?(谷歌地图API)
- 调用setTimeout内部的函数时发生引用错误
- 未捕获的引用错误:未定义<映射键>
- Javascript错误:未捕获引用错误:未定义编辑
- Google可视化addListener调用函数引用错误
- Cordova:未捕获引用错误:chbrody没有使用SQLitePlugin.js定义PhoneGap
- 未捕获引用错误:未定义PrintThisPage
- 引用错误:在尝试使用ajax发送数据时未定义
- 包含的文件中引发引用错误..除非调用文件包含慢速代码
- 在表单提交按钮的点击事件中调用函数时发生引用错误
- 未捕获引用错误:幻灯片未定义