首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分配返回匿名函数的匿名函数

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

Stack Overflow用户
提问于 2012-10-29 19:41:35
回答 2查看 236关注 0票数 5

在JavaScript中,调用如下代码有什么不同:

代码语言:javascript
复制
var reader = new FileReader();

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

reader.readAsText(file);

and (结果与loadData函数相同):

代码语言:javascript
复制
var reader = new FileReader();

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

reader.readAsText(file);

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-29 19:52:09

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

代码语言:javascript
复制
var reader = new FileReader();

var my_temporary_var = 42;

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

到目前为止,一切都是一样的。但是如果你改变了my_temporary_var,它也会在你的匿名函数中被改变。为了防止出现这种情况,您可以创建一个闭包:

代码语言:javascript
复制
reader.onload = (function(some_value) {
    return function(e){
        loadData(e.target.result, some_value);
    };
})(my_temporary_var);

您创建了一个匿名函数,该函数接受要绑定到另一个函数的参数,然后立即调用此函数。请注意,已经解决了对my_temporary_var的依赖。

其他示例

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

代码语言:javascript
复制
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(); };使用对象myObjects[i]。然而,i == myObjects.length:我们访问一个根本不存在的对象!由于我们试图访问该函数的属性,我们将得到一个异常,脚本将停止。

这是因为匿名函数中的i是一个引用,而不是用作一个值。为了防止这种情况,您必须使用闭包:

代码语言:javascript
复制
var i;
for(i = 0; i < myObjects.length; ++i)
    myObjects[i].onload = (function(index){
        return function(e) { myObjects[index].doSomething(); };
    })(i);
票数 2
EN

Stack Overflow用户

发布于 2012-10-29 20:02:38

它与下面的示例非常相似:

代码语言:javascript
复制
var fruit = "Apple";

var fruit = (function(X) {
    return "Apple";
})(1);

您只需将赋值包含在闭包中,在上面的情况下,闭包根本没有任何作用。但是如果你这样做的话:

代码语言:javascript
复制
var fruit_names = ["Pear", "Apple"];
var fruits = [];
for (x in fruits) {
    fruits.push({
        getName: (function(fruit_id) {
            return fruits[fruit_id];
        })(x)
    });
}

您刚刚创建了一个对象数组,这些对象都具有getName函数,这些对象从fruit_names数组返回自己的名称。这种闭包的使用可以创建非常灵活的结构,因为在本例中,您可以通过更改fruit_names数组来更改水果对象的名称,该数组充当对象的配置接口。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13120932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档