javascript – 指定返回匿名函数的匿名函数

前端之家收集整理的这篇文章主要介绍了javascript – 指定返回匿名函数的匿名函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
调用这样的东西时,JavaScript有什么区别:
var reader = new FileReader();

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

reader.readAsText(file);

和(loadData函数中的结果相同):

var reader = new FileReader();

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

reader.readAsText(file);

到目前为止,我已经将JavaScript用于简单的任务(输入验证,简单的ajax调用),但现在我需要一些更深层次的未完成…

解决方法

在您的特定情况下没有区别(请注意,您的第一个片段中的函数是使用参数文件调用的,但是因为您忽略它,所以它不应该有任何副作用).但是,请看下面的示例:
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循环之后.给定的处理函数(e){myObjects [i] .doSomething(); };使用对象myObjects [i].但是,我= = myObjects.length:我们访问一个甚至不存在的对象!因为我们尝试访问该函数属性,我们将得到一个异常,脚本将停止.

发生这种情况是因为我在匿名函数中是一个引用,而不是用作值.为了防止这种情况,你必须使用一个闭包:

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

猜你在找的JavaScript相关文章