传递javascript方法params作为对象文字

时间:2014-01-30 10:11:46

标签: javascript parameter-passing

我习惯性地将参数传递给函数作为对象文字,因此......

主叫:

render({
 param1: 99
 param2: {'a': 88, 'b': 77}
});

方法:

render: function (p) {
 alert( p.param1);
 var data = p.param2;

 etc
}

我倾向于在所有情况下传递这样的参数 - 即使函数/方法只接受1个参数。原因是我觉得这个方法很整洁,如果我希望以后添加另一个参数,添加到对象很简单。

我想从一些有经验的javascript人员那里了解,如果有任何理由以这种方式做事可能是一个坏主意 - 我不与其他开发人员合作,所以有时候我不确定我做事的方式是否正确。

谢谢!

4 个答案:

答案 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)。

也许我没有完全有资格谈论这个问题但是,我担心它可能会导致软件架构方面的坏习惯。我的意思是,忽略函数的签名,你正在创建某种“全能”功能,容易变异,但很难表征。这真的是一个缺点吗?这个问题可能已经有过争论,我相信值得思考。

值得注意的是,这种模式隐含地需要创建一个对象。除了它可能对表演产生负面影响之外,对于那些不熟悉它的人来说,这种编码风格可能更难理解。