为什么是FileReader ?带有自执行函数的Onload处理程序集
Why is FileReader.onload handler set with a self executing function
使用web应用程序中的文件遵循代码MDN:
function handleFiles(files) {
for (var i = 0; i < files.length; i++) {
var file = files[i];
var imageType = /image.*/;
if (!file.type.match(imageType)) {
continue;
}
var img = document.createElement("img");
img.classList.add("obj");
img.file = file;
preview.appendChild(img); // Assuming that "preview" is a the div output where the content will be displayed.
var reader = new FileReader();
reader.onload = (function(aImg) { return function(e) { aImg.src = e.target.result; }; })(img);
reader.readAsDataURL(file);
}
}
聚焦这一行:
reader.onload = (function(aImg) { return function(e) { aImg.src = e.target.result; }; })(img);
自执行函数背后的原因是什么?我理解img被传递给函数并在返回函数的方法中使用,但是为什么他们不像这样引用它:
reader.onload = function(e) { img.src = e.target.result; };
在for
循环中没有特殊的作用域,因此在循环中声明变量将在每次迭代时覆盖变量,因此
for (var i = 0; i < 10; i++) {
var img = document.createElement("img");
setTimeout(function() {
console.log(img);
}, 100);
}
将只记录最后一个映像,记录10次。
同样的setTimeout
是异步的,reader.onload
也是异步的,它在稍后的时间执行回调,所以因为img变量在循环中定义不正确,需要一个闭包来创建一个新的作用域来锁定img
的值,它也可以被写为
(function(aImg) {
reader.onload = function() {
aImg.src = e.target.result;
}
})(img);
有人决定聪明一点,写一个IIFE,在每次迭代中锁定img
的值,并返回一个函数。
换句话说,如果它们只是在没有IIFE的情况下引用它,它们最终只会得到最后一个img
,因为for循环会在每次迭代中完成并覆盖img
变量,并且onload函数稍后执行,当循环完成并且img
只保存最后一个值集时。
相关文章:
- 在phonegap中为android调用onload函数的最佳方式
- 将函数从onclick修改为onload
- 如何调用表td标记内的Onload函数
- 不执行包含的页面的Javascript onload函数
- 你能停止window.onload函数吗
- 无法将java脚本函数与Panel'绑定;s OnLoad事件
- 使用多个JavaScript Onload函数
- body onLoad未调用动态生成的javascript函数
- 将函数分配给Reader.onload
- 如何只使用一次window.onload函数
- 在iframe中禁用onload函数的Javascript
- 调用了javascript函数onload并单击按钮
- 触发具有$this的Jquery函数.onload和onclick
- 函数onload()拒绝运行
- 切换到为窗口上的对象分配函数.Onload而不是显式加载.经历困难
- 外部JS函数onload与用户函数onload冲突
- 如何运行一个没有窗口的函数.onload包装
- 同时调用ajax函数onload和onclick
- jquery悬停函数onLoad在firefox中不起作用
- 我如何运行一个函数onload,然后从onclick事件再次调用它