Я использую JavaScript с jQuery. Я хотел бы реализовать параметрические усилители. В C# это выглядело бы примерно так:
/*
* odp the object to test
* error a string that will be filled with the error message if odp is illegal. Undefined otherwise.
*
* Returns true if odp is legal.
*/
bool isLegal(odp, out error);
Что лучший способ состоит в том, чтобы сделать что-то вроде этого в JS? Объекты?
function isLegal(odp, errorObj)
{
// ...
errorObj.val = "ODP failed test foo";
return false;
}
Firebug говорит мне, что вышеупомянутый подход работал бы, но является там лучшим путем?
Да, как вы сами упомянули, объекты - лучший и единственный способ передачи данных по ссылке в JavaScript. Я бы оставил вашу функцию isLegal
как таковую и просто вызывал ее следующим образом:
var error = {};
isLegal("something", error);
alert(error.val);
Я думаю, что это довольно почти единственный способ (но я не заядлый программист на JavaScript;)).
Вы также можете рассмотреть возможность использования функции обратного вызова:
function onError(data) {
// do stuff
}
function isLegal(odp, cb) {
//...
if(error) cb(error);
return false;
}
isLegal(value, onError);
Подход обратного вызова, упомянутый @Felix Kling, вероятно, лучшая идея, но я также обнаружил, что иногда легко использовать синтаксис литерала объекта Javascript и просто сделать так, чтобы ваша функция возвращала объект при ошибке:
function mightFail(param) {
// ...
return didThisFail ? { error: true, msg: "Did not work" } : realResult;
}
тогда, когда вы вызываете функцию:
var result = mightFail("something");
if (result.error) alert("It failed: " + result.msg);
Не изящно и вряд ли пуленепробиваемое, но, конечно, это нормально для некоторых простых ситуаций.