命名函数和具有不同效果的匿名函数

时间:2013-05-31 09:41:15

标签: javascript backbone.js refactoring closures anonymous-function

我的问题:

我正在重构我的一些代码,并为一些长匿名函数命名。不幸的是,它以我不理解的方式打破了应用程序。

代码

匿名版工作正常,

  

警报(distributeurs.length);

与0不同。

 var group = this.settings.group, //group used to store all the markers added to the map
            leads = this.model.get("leads"), // collection of leads
            distributeurs = new Distributeurs(), // collection of distributeurs
            map = this.settings.map,
            addLeadsCollection = this.addLeadsCollectionFnContructor();


        //ajax calls to populate collection
        $.when(leads.fetch({ data: $.param({ departementCode: departementCode }) }), distributeurs.fetch({ data: $.param({ departementCode: departementCode }) })).done(
            function () //the function
            {
                alert( distributeurs.length ); //the alert
                distributeurs.map( function ( distributeur )
                {
                    addLeadsCollection( leads.filter( function ( lead )
                    {
                        return distributeur.get( "id" ) === lead.get( "distribution" );
                    }
                ) );
                }
            );
            }
        );

命名版本:它没有任何作为

  

警报(distributeurs.length);

始终为0。

var group = this.settings.group, //group used to store all the markers added to the map
            leads = this.model.get("leads"), // collection of leads
            distributeurs = new Distributeurs(), // collection of distributeurs
            map = this.settings.map,
            addLeadsCollection = this.addLeadsCollectionFnContructor();



        //the function
        var addCollections = function() {
            alert(distributeurs.length); //the alert
            distributeurs.map(function(distributeur) {
                addLeadsCollection(leads.filter(function(lead) {
                    return distributeur.get("id") === lead.get("distribution");
                }
                ));
            }
            );
        };

        //ajax calls to populate collection
        $.when(leads.fetch({ data: $.param({ departementCode: departementCode }) }), distributeurs.fetch({ data: $.param({ departementCode: departementCode }) })).done(
            addCollections()
        );

我的问题

为什么这两个函数的行为不同,我应该如何声明我的命名函数,使其像匿名函数一样。

2 个答案:

答案 0 :(得分:3)

addCollections()中删除括号。你正在立即调用这个函数;你要做的是改为传递函数。

实际上,在这两种情况下,您的函数都是匿名的。您在第二种情况下所做的就是将函数的引用分配给变量。要使函数不是匿名函数,可以使用函数声明

function addCollections() {
    // Stuff...
}

...或使用named function expression

var addCollections = function someName() {
    // someName is now a reference to the function, but only
    // within the function
};

答案 1 :(得分:1)

这不是命名函数,而是将函数赋给名为addCollections的变量。你的问题是你正在调用函数而不是传入引用:

$.when(leads.fetch({ data: $.param({ departementCode: departementCode }) }), distributeurs.fetch({ data: $.param({ departementCode: departementCode }) })).done(
            addCollections()
        );

删除括号:

$.when(leads.fetch({ data: $.param({ departementCode: departementCode }) }), distributeurs.fetch({ data: $.param({ departementCode: departementCode }) })).done(
                addCollections
            );