Javascript 函数似乎访问变量的最后一个引用,而不是将其存储在函数调用中
我本打算写一篇冗长而复杂的文章,但我想采用直接的方法 我有一个循环,它创建了一个元素数组,其中变量Url。该数组如下所示:Javascript 函数似乎访问变量的最后一个引用,而不是将其存储在函数调用中,javascript,jquery,Javascript,Jquery,我本打算写一篇冗长而复杂的文章,但我想采用直接的方法 我有一个循环,它创建了一个元素数组,其中变量Url。该数组如下所示: x = [url,function(){...},function(){...}]; 然后进入arrayList: arrayList = [x1,x2,x3,x4,x5]; 我认为到目前为止这是有道理的。它存储在arrayList对象、1个变量和2个函数中 这是踢球的人 当我遍历arrayList时,url都是相同的,这是创建arrayList的forloop中对
x = [url,function(){...},function(){...}];
然后进入arrayList:
arrayList = [x1,x2,x3,x4,x5];
我认为到目前为止这是有道理的。它存储在arrayList对象、1个变量和2个函数中
这是踢球的人
当我遍历arrayList时,url都是相同的,这是创建arrayList的forloop中对url的最后一次引用
我试图解决这个问题,对变量执行.toString()操作,将其内容存储在数组中,而不是变量名本身。那没用:(
我该怎么解决这个问题呢?我很困惑:-(
编辑:我想显示循环的外观,因为其中一个答案是关于数组不准确地引用它的
Edit2:导致问题的url是下面显示文件中的内部url。看起来这些url都指向同一个引用,这是一个nono。我该如何更改这些url?是否必须将其作为参数传递?
var newArray = new Array();
for(var i=0;i<fileUrls.length;++i) {
var url = fileUrls[i];
var x = [];//new Array();
x = [url,
function(){
displayFile(url, 'image', null, ft_id, null, null, null, null, !MA.isiOS());
},
function(e){
if(DEBUG) console.log('Error creating gallery thumbnail');
alert('There was a problem creating a thumbnail');
MA.hideMessage();
}
];
newArray.push(x);
}
var newArray=newArray();
对于(var i=0;i我认为你拥有的是:
arrayList = [x,x,x,x,x];
也就是说,一个数组包含对同一对象的多个引用。如果是这种情况,那么当您查看不同项目中的url
属性时,您一直在查看同一属性,因为它是一个项目
这将是重用数组来填充arrayList
数组的结果,例如:
var x = [];
var arrayList = [];
for (int i = 0; i < 5; i++) {
x[0] = 'url ' + i;
x[1] = function(){};
x[2] = function(){};
arrayList.push(x);
}
如果在循环中构造这些函数,并且函数内部引用“url”,则它们都引用同一个变量。使用“外部”变量的引用构造函数不会“冻结”变量的值。它仍然是“活动的”引用外部作用域中的变量。让我添加一个编辑,以便您了解更多我所做的事情……正如我相信我做了您要求的解决方案一样,这仍然是一个问题。我将发布循环我有URL是变量的正确URL,在我的顶部示例中。问题是数组第一个函数中的URL。在内部,它需要函数(){displayFile(URL,'image'…);}相同的url,但外部的不同。数组中的url
值是否真的在所有项中都相同?调用displayFile
中使用的url
值将是函数关闭时捕获的局部变量,因此对于所有项都是相同的。[您在我键入时回答了这个问题。]要从每次迭代中获取特定值,您需要另一个闭包来捕获变量的值,而不是变量本身。请参见上面的编辑。
var arrayList = [];
for (int i = 0; i < 5; i++) {
var x = [];
x[0] = 'url ' + i;
x[1] = function(){};
x[2] = function(){};
arrayList.push(x);
}
var newArray = new Array();
for(var i=0;i<fileUrls.length;++i) {
var url = fileUrls[i];
var x = [];//new Array();
var f;
(function(url){
f = function(){
displayFile(url, 'image', null, ft_id, null, null, null, null, !MA.isiOS());
};
})(url);
x = [url, f ,
function(e){
if(DEBUG) console.log('Error creating gallery thumbnail');
alert('There was a problem creating a thumbnail');
MA.hideMessage();
}
];
newArray.push(x);
}