我看到很多javascript代码将函数作为返回匿名对象的参数传递。
myFunction(function() {
return {
foo: 'bar'
};
});
使用它的优点或目的是什么,而不是简单地直接传递匿名对象?
myFunction({
foo: 'bar'
});
答案 0 :(得分:2)
不同之处在于,如果您更改第二个代码段中传递的参数,则无法再次获取原始参数。
如果你传递一个函数,你可以多次调用该函数并返回相同的参数。 (如果函数以这种方式实现)
此外,如果您使用某个功能,您可以执行其他操作,例如记录调用函数/参数的频率等等。因此,使用函数可为函数用户增加更多灵活性
另一方面,对于函数的开发人员来说,接受函数作为参数可能会导致每次调用函数时函数不必返回相同值的微小问题 - myFunc() == myFunc()
COULD返回false,因此我会不建议移交函数,如果它应该返回一个参数。
答案 1 :(得分:1)
Backbone使用了很多地方,如果传递它们来获取值,它们将初始化函数,例如。
Backbone.Model.extend({
url: function() { return 'myurl.aspx'; }
});
// VS
Backbone.Model.extend({
url: 'myurl.aspx'
});
如果您在知道网址之前必须进行一些计算/运行某些条件,这很聪明。
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';
答案 2 :(得分:0)
我认为,这实际上取决于您看到所使用代码的位置。
在这种情况下,myFunction
似乎要求您传递函数而不是对象。
但总的来说,请考虑这个
myFunction(function() {
var a = "bar";
return {
foo: a
};
});
和此:
var a = "bar"
myFunction({
foo: a
});
在第二种情况下,外面的任何人都可以访问 a 。但在第一种情况下,a变得类似于由函数公开为公共的私有变量。因此,您可能会在人们希望在无类别的JS中遵循OOP概念的地方观察到这一点。
另一种情况是需要回调函数或稍后要调用的函数。因此,如果要保留数据直到某个事物结束,您可以将其作为函数的返回值,而不是全局存储...
答案 3 :(得分:0)
在第一个示例中,您正在传递回调函数。
When we pass a callback function as an argument to another function,
we are only passing the function definition. We are not executing the function
in the parameter.
And since the containing function has the callback function in its parameter as a function definition, it can execute the callback anytime. This allows us to execute the callback functions at any point in the containing function.
一个简单的例子是jQuery点击绑定:
/The anonymous function is not being executed there in the parameter.
//The anonymous function is a callback function
$("#btn_1").click(function() {
alert("Btn 1 Clicked");
});
但是在第二个例子中,你只是将一个对象传递给被调用的函数。
使用此link获取有关回调函数的更多详细信息。享受:)