我不时使用JavaScript,尝试使用我习惯使用其他语言的模式。当函数结果是关于操作成功的时候,其中一个参数是对实际返回值的引用。
知道JavaScript中没有通过引用传递,唯一的方法是使用对象(包括数组)。像
这样的东西function getSomething(res)
{
if (....)
{
res["value"] = 123;
return true;
} else
return false;
}
但这会带来一些不便。其中之一是当我实际使用这个功能时,我不应该忘记约定,所以我自然的处理方法是
var value = {};
if (getSomething(value))
{
if (value == 123)
{
}
}
当我应该记住的正确方法是
...
if (value["value"] == 123)
...
此外,如果我忘记使用{}初始化值,那么我会收到另一个错误。
所以,对于那些混合语言的人来说,这可能是一个问题。您认为这种返回模式方便的约定是什么?
更新: 作为将出现在C程序中的实际代码片段的示例
if (getSomethingA(&res1) && getSomethingB(&res2) && getSomethingC(&res3)) {
...
v = res1*res2*res3;
...
}
我无法弄清楚如何在JavaScript中实现类似这样的东西,而不是“不那么容易记住约定”或太多行。
答案 0 :(得分:2)
为什么不创建响应对象并在其中包含状态和实际响应值的一些字段。每次返回该对象,而不是在false上返回false,在true上返回数组
成功
response=new Object();
response.status=true;
response.value="Response string";
return response;
失败
response=new Object();
response.status=false;
response.value="Response string";
return response;
您还可以使用其他语法来避免extra line
response={status:true,value:"Response string"};
答案 1 :(得分:1)
如果您的首要任务是编写与C示例最相似的代码,则可以将getSomething()
函数作为对象传递,在这种情况下,您可以通过引用很好地操作它,同时返回一个单独的值(还可以查看this fiddle):
var someA = {}, someB={}, someC={};
if(getSomethingA(someA) && getSomethingB(someB) && getSomethingC(someC)) {
var values = [someA.value, someB.value, someC.value];
alert('Success...Values are:\n' + values.join('\n'));
} else {
alert('Failure!');
}
function getSomethingA(refObj) {
if(...) {
refObj.value = 123;
return true;
} else {
return false;
}
}
function getSomethingB(refObj) {
if(...) {
refObj.value = 456;
return true;
} else {
return false;
}
}
function getSomethingC(refObj) {
if(...) {
refObj.value = 789;
return true;
} else {
return false;
}
}