我习惯性地将参数传递给函数作为对象文字,因此......
主叫:
render({
param1: 99
param2: {'a': 88, 'b': 77}
});
方法:
render: function (p) {
alert( p.param1);
var data = p.param2;
etc
}
我倾向于在所有情况下传递这样的参数 - 即使函数/方法只接受1个参数。原因是我觉得这个方法很整洁,如果我希望以后添加另一个参数,添加到对象很简单。
我想从一些有经验的javascript人员那里了解,如果有任何理由以这种方式做事可能是一个坏主意 - 我不与其他开发人员合作,所以有时候我不确定我做事的方式是否正确。
谢谢!
答案 0 :(得分:4)
参数桶基本上是个好主意。这里缺少什么:
render: function (p) {
alert( p.param1);
var data = p.param2;
etc
}
是,如果未设置p.param2
,您仍然会继续undefined
。存储桶需要使用默认值进行验证。有一个线程here,正在讨论这个问题。
为了使其更具通用性,您可以这样做:
render: function (p) {
var myDefaults = { param1: 99
param2: {'a': 88, 'b': 77} };
$.extend(p, myDefaults);
alert( p.param1);
var data = p.param2;
etc
}
并查看here了解jQuery doc
答案 1 :(得分:0)
没有参数......:)
我开始喜欢你..但我注意到我的大多数功能都是基于ajax或事件或基于插件。在那种情况下,我从不使用参数,否则我必须使用绑定并丢失原生Event.So我尝试从全局或元素中获取我需要的一切。
(function(){
var myGlobals={};
function ajax(){
//....
};
function handleAjax(e){
myGlobals.currentAjaxResponse=JSON.parse(this.response);
}
function handleClick(e){
myGlobals.elements
myGlobals.currentAjaxResponse
myGlobals.data
e.target
}
function handleLoad(e){
myGlobals.elements=document.getElemntsByClassName('buttons');
myGlobals.elements[0].addEventListener('click',calculateXY,false);
myGlobals.data={x:1,y:2}
window.removeEventListener('load',handleLoad,false);
}
function calculateXY(){
myGlobals.data.x+
myGlobals.data.y+
(myGlobals.elements[0].dataset['num']*1)+
(e.target.dataset['num']*1)+
myGlobals.currentAjaxResponse.key
}
window.addEventListener('load',handleLoad,false);
})()
只有当我使用一些基本的实用程序来转换我使用的东西时:
function(argument){return result}
并且大多数时候我只需要一个参数。
正如你所说,如果我需要一个对象,我会传递一个对象。
答案 2 :(得分:0)
在我的观点中,它的味道如何传递你的参数。我认为你应该验证你的对象文字参数或者提供类似jQuery.extend的默认值:
var myParams = jQuery.extend({
param1: 99 // default value for param1
param2: { a: 10, b: 10 } // default value for param2
}, params);
在渲染方面,就像在你的例子中,性能可能是一个选项的参数。我做了一个快速测试http://jsperf.com/obj-literal-params。在我的情况下(Chrome 32),使用jQuery.extend的对象文字参数比使用普通函数参数慢大约80%。但是当与渲染函数的其余部分相关时,这可能是一个无关紧要的性能损失。
我的结论是:使用您最喜欢的内容以及使代码更易于阅读的内容
答案 3 :(得分:0)
这种模式肯定是有用的,但我倾向于不使用它,除非它实际上是合理的 - 因为它正在考虑jQuery.extend()
或数据绑定(link)。
也许我没有完全有资格谈论这个问题但是,我担心它可能会导致软件架构方面的坏习惯。我的意思是,忽略函数的签名,你正在创建某种“全能”功能,容易变异,但很难表征。这真的是一个缺点吗?这个问题可能已经有过争论,我相信值得思考。
值得注意的是,这种模式隐含地需要创建一个对象。除了它可能对表演产生负面影响之外,对于那些不熟悉它的人来说,这种编码风格可能更难理解。