0

我试图X在遍历 array 时将元素推入 array Y。在某些时候,在将新元素推入数组 X 时,我在浏览器控制台中收到“意外令牌:”错误。我能够在失败之前正确推送几个元素(几乎每次都在第 7 个元素左右)。

它是递归函数,可能会导致问题......这是代码:

function getPosition(img) {
    var tmpRandPosition = Math.floor(Math.random() * (9));

    if($.inArray(galleryPositions[tmpRandPosition], populatedPositions) != -1) {
        setTimeout("getPosition("+img+")",1);
    } else {
        populatedPositions.push(galleryPositions[tmpRandPosition]);

        return true;
    }
}

正如您从脚本中看到的那样,我试图在 HTML 中的 8 个不同定位元素上随机显示照片。

4

3 回答 3

3

似乎问题出在setTimeout功能上。尝试使用匿名函数而不是串联将参数传递给该函数:

setTimeout(function() { getPosition(img) }, 1);
于 2012-05-10T14:22:46.180 回答
2

这将打破:

setTimeout("getPosition("+img+")",1);

因为它实际上写道:

setTimeout("getPosition(img_path.jpg)",1);

并尝试评估它(使用eval)。

问题是 JS 认为img_path.jpg是一个变量。

使固定:

setTimeout("getPosition('"+img+"')",1);

但永远不要这样做,因为评估字符串不好或不快。

而是向 setTimeout 发送一个匿名函数:

修正:

setTimeout(function() {
    getPosition(img);
}, 1);
于 2012-05-10T14:27:59.580 回答
1

不要使用字符串参数调用 setTimeout。 总是使用一个函数。如果 img 变量易受攻击,则在这种情况下使用该字符串会使该代码遭受注入攻击。

于 2012-05-10T14:31:19.437 回答