0

不时使用 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 中实现这样的东西。

4

2 回答 2

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"};
于 2013-02-01T09:09:12.500 回答
1

如果您的首要任务是编写与您的 C 示例最相似的代码,您可以将您的getSomething()函数传递给一个对象,在这种情况下,您可以通过引用很好地操作它,同时返回一个单独的值(也可以查看这个 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;
    }
}
于 2013-02-01T11:02:22.983 回答