在您的特定情况下没有区别(请注意,您的第一个片段中的函数是使用参数调用的file
,但由于您忽略它,它不应该有任何副作用)。但是,请看以下示例:
var reader = new FileReader();
var my_temporary_var = 42;
reader.onload = function(e){
loadData(e.target.result, my_temporary_var);
}
到目前为止,一切都是一样的。但是,如果您进行更改my_temporary_var
,它也会在您的匿名函数内部进行更改。为了防止这种情况,您创建了一个闭包:
reader.onload = (function(some_value) {
return function(e){
loadData(e.target.result, some_value);
};
})(my_temporary_var);
你创建一个匿名函数,它接受你想要绑定到另一个函数的参数,然后立即调用这个函数。请注意,依赖my_temporary_var
已解决。
其他示例
有些人喜欢在 for 循环中创建许多函数:
var i;
for(i = 0; i < myObjects.length; ++i)
myObjects[i].onload = function(e) { myObjects[i].doSomething(); };
让我们假设myObjects[0].onload
将首先处理,但在for 循环之后。给定的处理程序function(e) { myObjects[i].doSomething(); };
使用 object myObjects[i]
。但是,i == myObjects.length
: 我们访问了一个甚至不存在的对象!由于我们尝试访问该函数的属性,我们将得到一个异常并且脚本将停止。
发生这种情况是因为i
在匿名函数中是一个引用,而不是用作值。为了防止这种情况,您必须使用闭包:
var i;
for(i = 0; i < myObjects.length; ++i)
myObjects[i].onload = (function(index){
return function(e) { myObjects[index].doSomething(); };
})(i);