Javascript 分配返回匿名函数的匿名函数

Javascript 分配返回匿名函数的匿名函数,javascript,Javascript,在JavaScript中,调用这样的东西有什么区别: var reader = new FileReader(); reader.onload = (function (theFile) { return function (e) { loadData(e.target.result); }; })(file); reader.readAsText(file); 和(在loadData函数中的结果相同): 到目前为止,我一直使用JavaScript执行简单

在JavaScript中,调用这样的东西有什么区别:

var reader = new FileReader();

reader.onload = (function (theFile) {
    return function (e) {
        loadData(e.target.result); 
    };
})(file);

reader.readAsText(file);
和(在loadData函数中的结果相同):


到目前为止,我一直使用JavaScript执行简单任务(输入验证、简单ajax调用),但现在我需要一些更深入的理解…

在您的特定情况下,没有区别(请注意,您的第一个片段中的函数是使用参数
file
调用的,但由于您忽略了它,因此不应该有任何副作用)。但是,请看以下示例:

var reader = new FileReader();

var my_temporary_var = 42;

reader.onload = function(e){
    loadData(e.target.result, my_temporary_var);
}
到目前为止,一切都是一样的。但是如果您更改
my\u temporary\u var
,它也将在匿名函数中更改。要防止出现这种情况,请创建一个闭包:

reader.onload = (function(some_value) {
    return function(e){
        loadData(e.target.result, some_value);
    };
})(my_temporary_var);
var i;
for(i = 0; i < myObjects.length; ++i)
    myObjects[i].onload = (function(index){
        return function(e) { myObjects[index].doSomething(); };
    })(i);
创建一个匿名函数,该函数接受要绑定到另一个函数的参数,然后立即调用该函数。请注意,对
my_temporary_var
的依赖关系已经解决

其他例子 有些人喜欢在for循环中创建许多函数:

var i;
for(i = 0; i < myObjects.length; ++i)
    myObjects[i].onload = function(e) { myObjects[i].doSomething(); };

与以下示例非常相似:

var fruit = "Apple";

var fruit = (function(X) {
    return "Apple";
})(1);
您只需将分配包含在一个闭包中,在上述情况下,闭包没有任何作用。但如果你这样做:

var fruit_names = ["Pear", "Apple"];
var fruits = [];
for (x in fruits) {
    fruits.push({
        getName: (function(fruit_id) {
            return fruits[fruit_id];
        })(x)
    });
}
您刚刚创建了一个对象数组,所有对象都具有
getName
函数,该函数从
fruit\u names
数组返回它们自己的名称。这种闭包的使用可以创建非常灵活的结构,因为在本例中,您可以通过更改
fruit\u names
数组来更改fruit对象的名称,该数组用作对象的配置接口

var fruit_names = ["Pear", "Apple"];
var fruits = [];
for (x in fruits) {
    fruits.push({
        getName: (function(fruit_id) {
            return fruits[fruit_id];
        })(x)
    });
}