关于异步、作用域、闭包
时间: 2019-04-09来源:博客园
前景提要
关于异步、作用域、闭包
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 显示帮助
使用"Ctrl+Enter"可进行快捷提交,评论支持部分 Markdown 语法:[link](http://example.com) _italic_ **bold** `code`。
< > 分享
分享您的问题
所有回答(3) 0 你试下,在 for 循环里面重新定义一个变量接收 i 值,比如 var j = i; 然后打印 j 三人乐乐 | 园豆:3245 (老鸟四级) | 2019-04-09 10:14 试了一下,还是不行 支持( 0 ) 反对( 0 ) 小潇洒 | 园豆:96 (初学一级) | 2019-04-09 10:20 编辑文本 预览 上传图片
Ctrl+Enter键快速提交 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 编辑文本 预览 上传图片
Ctrl+Enter键快速提交 0 没什么问题啊 zzhenxiang | 园豆:225 (菜鸟二级) | 2019-04-09 18:40 在上面我回复@西南偏北的时候有贴出完整代码,你可以试一下,如果我上传五张二维码图片,那里打印出来的每次都是 4 。不知道为什么 支持( 0 ) 反对( 0 ) 小潇洒 | 园豆:96 (初学一级) | 2019-04-10 10:15 编辑文本 预览 上传图片
Ctrl+Enter键快速提交
清除回答草稿
您需要 登录 以后才能回答,未注册用户请先 注册 。

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

热门排行