首页 新闻 搜索 专区 学院

关于异步、作用域、闭包

0
悬赏园豆:20 [待解决问题]
var getObjectURL = function(file) {
    var url = null;
    if (window.createObjectURL != undefined) { // basic
        url = window.createObjectURL(file);
    } else if (window.URL != undefined) { // mozilla(firefox)
        url = window.URL.createObjectURL(file);
    } else if (window.webkitURL != undefined) { // webkit or chrome
        url = window.webkitURL.createObjectURL(file);
    }
    return url;
}

for (let i = 0; i < fileList.length; i++) {
   qrcode.decode(getObjectURL(fileList[i]));
     (function(i){
        qrcode.callback = function(imgMsg) {
            console.log(i)
            console.log(imgMsg)
        }
    })(i)
}

上面的代码是一段二维码的解析,循环解析fileList数组里面的二维码文件并打印解析后的内容,这些都没有问题。主要是想问一下,我用 (function(i){})(i) 保护了变量 i ,所以应该按顺序打印出 0,1,2,3,4(假设数组长度为5),可是最后的结果是 4,4,4,4,4?不知道是什么原因,哪位大佬能给解释一下吗?

小潇洒的主页 小潇洒 | 初学一级 | 园豆:96
提问于:2019-04-09 09:47
< >
分享
所有回答(3)
0

你试下,在 for 循环里面重新定义一个变量接收 i 值,比如 var j = i; 然后打印 j

三人乐乐 | 园豆:3250 (老鸟四级) | 2019-04-09 10:14

试了一下,还是不行

支持(0) 反对(0) 小潇洒 | 园豆:96 (初学一级) | 2019-04-09 10:20
0

for (let i = 0; i < fileList.length; i++) {
qrcode.decode(getObjectURL(fileList[i]));
(function(i){
//qrcode.callback = function(imgMsg) {
console.log(i)
//console.log(imgMsg)
//}
})(i);
}
代码按照上面的做注释,然后就会得到你想要的0,1,2,3,4 的结果。

西越泽 | 园豆:10633 (专家六级) | 2019-04-09 12:01

这样的情况我知道能按照预想的结果打印出来,只是不知道为什么放在那个函数里面就不行了,

支持(0) 反对(0) 小潇洒 | 园豆:96 (初学一级) | 2019-04-09 18:18

@小潇洒: 因为代码不全,不好更进一步说。

支持(0) 反对(0) 西越泽 | 园豆:10633 (专家六级) | 2019-04-09 18:30

@西南偏北:

<input type="file" name="file" id="doc" multiple="multiple" onchange="javascript:setImagePreviews();" accept="image/*" />

<script src="reqrcode.js"></script>

        var getObjectURL = function(file) {
            var url = null;
            if (window.createObjectURL != undefined) { // basic
                url = window.createObjectURL(file);
            } else if (window.URL != undefined) { // mozilla(firefox)
                url = window.URL.createObjectURL(file);
            } else if (window.webkitURL != undefined) { // webkit or chrome
                url = window.webkitURL.createObjectURL(file);
            }
            return url;
        }
        var list;

        function setImagePreviews(avalue) {
            list = [];
            var docObj = document.getElementById("doc");
            var fileList = docObj.files;
            for (var i = 0; i < fileList.length; i++) {
                (function(i){
                    qrcode.decode(getObjectURL(fileList[i]));
                    qrcode.callback = function(imgMsg) {
                        console.log(i)
                        list.push(imgMsg);
                    }
                })(i)
            }
            return true
        }

以上基本上就是完整的代码,引入reqrcode.js解析二维码图片,用一个input标签用来上传二维码图片,然后解析这些文件

支持(0) 反对(0) 小潇洒 | 园豆:96 (初学一级) | 2019-04-09 18:42
0

没什么问题啊

zzhenxiang | 园豆:225 (菜鸟二级) | 2019-04-09 18:40

在上面我回复@西南偏北的时候有贴出完整代码,你可以试一下,如果我上传五张二维码图片,那里打印出来的每次都是 4 。不知道为什么

支持(0) 反对(0) 小潇洒 | 园豆:96 (初学一级) | 2019-04-10 10:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册