2014-01-30 3 views
1

Я обычно передавать параметры функции, как литералы объектов, таким образом ....прохождение Javascript метод PARAMS как объект буквального

призвание:

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

метод:

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

etc 
} 

Я, как правило, такие параметры пропускаются во всех случаях в настоящее время - даже если функция/метод принимает только один аргумент. Причина в том, что я нахожу этот метод аккуратным, а также, если я хочу добавить еще один параметр позже, его просто добавить к объекту.

Мне хотелось бы узнать, что у некоторых опытных пользователей javascript есть какая-то причина, по которой что-то происходит, может быть, плохая идея - я не работаю с другими разработчиками, поэтому иногда я не уверен, правильно ли я делаю что-то ,

Спасибо!

+0

Это очень частый шаблон, который вы найдете в большинстве JS, которые вы видите в сети. –

+1

Кажется мало лишним, если вы знаете, что функция принимает только один параметр, но я не вижу в этом ничего плохого (кроме дополнительных нажатий клавиш). – monners

+1

Я бы посоветовал вам продолжать использовать этот шаблон, когда вам нужно передать несколько аргументов, подумайте о том, как часто это происходит в таких библиотеках, как jQuery или другие плагины jQuery. –

ответ

3

Параметр ведра в основном хорошая идея. Чего не хватает здесь:

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 документ

+0

Спасибо Axel - использование продления - отличное предложение! - слишком новичок в SO, чтобы позволить вам проголосовать за ваш ответ, но если бы я мог :) – so1

0

нет аргументов ... :)

Я начал, как вы .. но я заметил, что большинство моих функций основаны на ajax или событиях или на основе плагина. В этом случае я никогда не использую аргументы еще, я должен использовать bind и потерять собственное событие. Поэтому я пытаюсь получить все, что мне нужно, от глобальных элементов или элементов.

(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); 
})() 

только если я использую некоторые основные utilies конвертировать материал я использую:

function(argument){return result} 

и большую часть времени я нужен только один аргумент.

И как вы говорите, если мне нужен объект, я передаю объект.

+0

Спасибо cocco - Я иногда использую «глобальные» в том, как вы описываете - обычно, когда ajaxing и обнаружение моего мозга слишком малы, чтобы справиться с какой бы черт он ни изменил контекст - я всегда чувствую себя немного виноватым в этом, вероятно, из-за слова «глобалы» - это все упрощает. – so1

+0

если вы напишете так, то проблем с именами не будет. так как ничто не может выйти наружу (function() {})() – cocco

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% медленнее, чем при использовании стандартных функциональных параметров. Но это может быть незначительной потерей производительности, связанной с остальной частью вашей функции рендеринга.

Мой conclusing является: Используйте то, что вам больше всего нравится и что делает код более readabl

+0

Спасибо - так же, как Аксель предложил выше, и хорошая идея! – so1

0

Эта модель может, конечно, быть полезным, но я стараюсь не использовать его, если это не на самом деле оправдано - как это рассматривает jQuery.extend() или например, привязка данных (link).

Возможно, я не полностью квалифицирован, чтобы говорить об этом, но, боюсь, что это может привести к вредным привычкам с точки зрения архитектуры программного обеспечения. Я имею в виду, игнорируя подпись функции, вы создаете какую-то «уловку», легко изменяемую, но плохо охарактеризованную. Это действительно недостаток? Этот вопрос, вероятно, уже обсуждался, и я считаю, что об этом стоит подумать.

Также стоит отметить, что этот шаблон неявно требует создания объекта. Помимо того, что это может оказать негативное влияние на выступления, этот стиль кодирования может быть сложнее понять для людей, которые не знакомы с ним.

Смежные вопросы