Javascript 将参数传递到循环中的回调函数会导致使用最终参数值计算所有回调

Javascript 将参数传递到循环中的回调函数会导致使用最终参数值计算所有回调,javascript,callback,Javascript,Callback,我很清楚这个问题已经被问过无数次了,但是我尝试了所有建议的解决方案,没有一个有效 我想我要做的是有一个作为闭包的回调,但我尝试这样做的每一种方式要么以回调中的参数“未定义”结束,要么回调调用得太早 var pages = ["why", "ux", "examples", "make", "marketplace"] for (i = 0; i < 5; i++) { alert("pages is" + pages[i]) if (filesadded.indexOf("

我很清楚这个问题已经被问过无数次了,但是我尝试了所有建议的解决方案,没有一个有效

我想我要做的是有一个作为闭包的回调,但我尝试这样做的每一种方式要么以回调中的参数“未定义”结束,要么回调调用得太早

var pages = ["why", "ux", "examples", "make", "marketplace"]
for (i = 0; i < 5; i++) {
    alert("pages is" + pages[i])
    if (filesadded.indexOf("[" + pages[i] + "]") == -1) {
        function fas2(callback) {

            var scriptadded = document.createElement('script')
            scriptadded.setAttribute("type", "text/javascript")
            //Date.now() is added to the end of the filename so that if the main page is reloaded, the other pages will update if in cache
            scriptadded.setAttribute("src", pages[i] + ".js?" + Date.now())

            scriptadded.onload = callback(pages[i]);
            scriptadded.onreadystatechange = callback(pages[i]);

            //adds line to head
            document.getElementsByTagName("head")[0].appendChild(scriptadded)
        }
        //adds file name to list of loaded files
        filesadded += "[" + pages[i] + "]"

        var addPage2 = function (toSwitch) {

            switch (toSwitch) {
                case "why":
                    why.addPage()
                    break;

            }
        }

        fas2(addPage2);
    }
}
var页面=[“为什么”、“用户体验”、“示例”、“制造”、“市场”]
对于(i=0;i<5;i++){
警报(“页面为”+页面[i])
if(filesadded.indexOf(“[”+页面[i]+“]”)==-1){
函数fas2(回调){
var scriptadded=document.createElement('script')
scriptadded.setAttribute(“类型”、“文本/javascript”)
//将Date.now()添加到文件名的末尾,以便在重新加载主页时,其他页面将在缓存中更新
scriptadded.setAttribute(“src”,pages[i]+“.js?”+Date.now())
scriptadded.onload=回调(第[i]页);
scriptadded.onreadystatechange=回调(第[i]页);
//在头部添加线条
document.getElementsByTagName(“head”)[0].appendChild(添加脚本)
}
//将文件名添加到已加载文件的列表中
添加的文件+=“[”+页面[i]+“]”
var addPage2=功能(toSwitch){
开关(toSwitch){
案例“为什么”:
为什么。addPage()
打破
}
}
fas2(addPage2);
}
}

在上面显示的版本中,回调调用得太早,我得到错误“找不到变量:为什么”。或者,当我有类似
scriptadded.onload=function(){callback(pages[I])的内容时回调在正确的时间被调用,但是toSwitch最终没有定义,所以我解决了我的问题

问题似乎是,因为它是一个闭包,所以pages[i]在函数完成后(调用回调时)仍保持活动状态,但它始终设置为其最终值(pages[5]==未定义)。换句话说,传递到回调中的是变量,而不是它的值。我能够让它工作的唯一方法是每次用一个设置值声明回调

            var testHolder = pages[i]
            alert("testHolder is" + testHolder)
            switch(testHolder)
            {
            case "why":
                fas2(function() {addPage2("why");});
                break;
            case "ux":
                fas2(function() {addPage2("ux");});
                break;
            case "marketplace":
                fas2(function() {addPage2("marketplace");});
                break;
            case "make":
                fas2(function() {addPage2("make");});
                break;
            case "examples":
                fas2(function() {addPage2("examples");});
                break;
            }
虽然这很混乱,但它适用于我的代码,我在其中迭代预定义的一组值。然而,其他人可能没有这么幸运,因此如果有人能找到更好的解决方案,可能会有所帮助

编辑:可以找到更好的解决方案


我没有将我的问题标记为重复问题,因为上述答案并不是专门针对回调的情况

可能重复-尽管您可以使用其他技术,例如
Function.prototype.bind
您发布的特定版本似乎存在格式问题-例如,
fas2
的右括号与
if(filesadded…
语句对齐,它在最后一行被关闭(并且
语句的
从不关闭),现在应该修正格式。这些问题是由于我将其粘贴到堆栈溢出中而引起的,在我的实际代码中不存在。中的答案对我的代码不起作用。当我尝试
fas2(function(){addPage2(pages[I]);})我没有定义