我看到很多 javascript 代码将函数作为返回匿名对象的参数传递。
myFunction(function() {
return {
foo: 'bar'
};
});
使用它而不是简单地直接传递匿名对象有什么好处或目的?
myFunction({
foo: 'bar'
});
我看到很多 javascript 代码将函数作为返回匿名对象的参数传递。
myFunction(function() {
return {
foo: 'bar'
};
});
使用它而不是简单地直接传递匿名对象有什么好处或目的?
myFunction({
foo: 'bar'
});
不同之处在于,如果您更改在第二个代码片段中传递的参数,则无法再次获取原始参数。
如果您传递一个函数,则可以多次调用该函数并始终返回相同的参数。(如果功能是这样实现的)
此外,如果你使用一个函数,你可以做一些额外的事情,比如记录你的函数/参数被调用的频率等等。因此,使用函数为函数的用户增加了更多的灵活性。
另一方面,对于函数的开发人员来说,接受一个函数作为参数可能会导致一个小问题,即函数每次调用时都不必返回相同的值 -myFunc() == myFunc()
可能返回 false,因此我不建议交出一个函数,如果它应该只返回一个参数。
骨干使用有很多地方,如果传递来获取值,它们将初始化函数,例如。
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';
我认为,这实际上取决于您在哪里看到正在使用的代码。
在这种情况下,myFunction
似乎需要您传递一个函数而不是一个对象。
但总的来说,考虑这个
myFunction(function() {
var a = "bar";
return {
foo: a
};
});
和这个:
var a = "bar"
myFunction({
foo: a
});
在第二种情况下,外部的任何人都可以访问. 但在第一种情况下,a 变得类似于由函数公开为公共的私有变量。因此,您可能会在人们希望在其他无类 JS 中遵循 OOP 概念的地方观察到这一点。
另一种情况是您需要回调函数或稍后要调用的某些函数。因此,如果要保留数据直到某件事结束,您可以将其作为函数的返回值提供,而不是全局存储它......