4

我看到很多 javascript 代码将函数作为返回匿名对象的参数传递。

myFunction(function() {
    return {
       foo: 'bar'
    };
});

使用它而不是简单地直接传递匿名对象有什么好处或目的?

myFunction({
    foo: 'bar'
});
4

4 回答 4

2

不同之处在于,如果您更改在第二个代码片段中传递的参数,则无法再次获取原始参数。
如果您传递一个函数,则可以多次调用该函数并始终返回相同的参数。(如果功能是这样实现的)

此外,如果你使用一个函数,你可以做一些额外的事情,比如记录你的函数/参数被调用的频率等等。因此,使用函数为函数的用户增加了更多的灵活性。
另一方面,对于函数的开发人员来说,接受一个函数作为参数可能会导致一个小问题,即函数每次调用时都不必返回相同的值 -myFunc() == myFunc()可能返回 false,因此我不建议交出一个函数,如果它应该只返回一个参数。

于 2013-06-05T13:10:51.213 回答
1

骨干使用有很多地方,如果传递来获取值,它们将初始化函数,例如。

 Backbone.Model.extend({
     url: function() { return 'myurl.aspx'; }
 });
 // VS
 Backbone.Model.extend({
     url: 'myurl.aspx'
 });

如果您必须在知道 url 之前进行一些计算/运行一些条件,这很聪明。

 Backbone.Model.extend({
     url: function() { 
         if ( this.get('name') ) {
             return 'service1.aspx';
         }
         else {
             return 'service2.aspx';
         }
     }
 });

您的第一个示例发送一个匿名函数作为第一个参数,myFunction而第二个示例发送一个对象作为第一个参数。

myFunction(function() {
    return {
       foo: 'bar'
    };
}); // function() {...}

myFunction({
    foo: 'bar'
}); // {foo: 'bar'}

function myFunction(what) {
    console.log(what);
}

如果您在谈论闭包,主要区别在于您可以在闭包内包含私有变量:

var setGet = (function() {
    var v = null;
    return {
        get: function() { return v; },
        get: function(val) { v=val; }, 
    };
});
// VS:
var setGet = {
    v: null,
    get: function() { return this.v; },
    get: function(val) { this.v; }, 
};

在第一个示例中,您无法在v不使用.get/.set的情况下访问变量,setGet而在 2. 示例中,我可以通过设置简单地更改它setGet.v = 'new_val';

于 2013-06-05T13:14:42.467 回答
0

我认为,这实际上取决于您在哪里看到正在使用的代码。

在这种情况下,myFunction似乎需要您传递一个函数而不是一个对象。

但总的来说,考虑这个

myFunction(function() {

    var a = "bar";

    return {
       foo: a
    };
});

和这个:

var a = "bar"

myFunction({
    foo: a
});

在第二种情况下,外部的任何人都可以访问. 但在第一种情况下,a 变得类似于由函数公开为公共的私有变量。因此,您可能会在人们希望在其他无类 JS 中遵循 OOP 概念的地方观察到这一点。


另一种情况是您需要回调函数或稍后要调用的某些函数。因此,如果要保留数据直到某件事结束,您可以将其作为函数的返回值提供,而不是全局存储它......

于 2013-06-05T13:16:54.330 回答
0
于 2013-06-05T13:18:35.800 回答