Nic*_*ner 35 javascript out-parameters
我在jQuery中使用Javascript.我想实现params.在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);
Run Code Online (Sandbox Code Playgroud)
在JS中做这样的事情的最佳方法是什么?对象?
function isLegal(odp, errorObj)
{
// ...
errorObj.val = "ODP failed test foo";
return false;
}
Run Code Online (Sandbox Code Playgroud)
Firebug告诉我上述方法可行,但是有更好的方法吗?
Poi*_*nty 41
@Felix Kling提到的回调方法可能是最好的想法,但我也发现有时候很容易利用Javascript对象的文字语法,只是让你的函数在错误时返回一个对象:
function mightFail(param) {
// ...
return didThisFail ? { error: true, msg: "Did not work" } : realResult;
}
Run Code Online (Sandbox Code Playgroud)
那么当你调用这个函数时:
var result = mightFail("something");
if (result.error) alert("It failed: " + result.msg);
Run Code Online (Sandbox Code Playgroud)
不花哨,几乎没有防弹,但对于一些简单的情况肯定是可以的.
cas*_*nca 16
是的,正如您自己提到的,对象是在JavaScript中通过引用传递数据的最佳和唯一方式.我会保持你的isLegal功能,简单地称之为:
var error = {};
isLegal("something", error);
alert(error.val);
Run Code Online (Sandbox Code Playgroud)
Fel*_*ing 15
我认为这是唯一的方法(但我不是一个铁杆JavaScript程序员;)).
您还可以考虑使用回调函数:
function onError(data) {
// do stuff
}
function isLegal(odp, cb) {
//...
if(error) cb(error);
return false;
}
isLegal(value, onError);
Run Code Online (Sandbox Code Playgroud)
到目前为止,我看到的答案没有在 JavaScript 中实现参数,因为它们在 C#(out关键字)中使用。它们只是一种在发生错误时返回对象的解决方法。
但是如果你真的需要参数,你会怎么做?
因为 Javascript 不直接支持它,所以你需要构建一些接近 C# 的输出参数的东西。看看这个方法,我在 JavaScript 中模拟 C#s DateTime.TryParse 函数。out 参数是结果,因为 JavaScript 没有提供 out 关键字,所以我.value在函数内部使用 将值传递到函数外部(受MDN 建议的启发):
// create a function similar to C#'s DateTime.TryParse
var DateTime = [];
DateTime.TryParse = function(str, result) {
result.value = new Date(str); // out value
return (result.value != "Invalid Date");
};
// now invoke it
var result = [];
if (DateTime.TryParse("05.01.2018", result)) {
alert(result.value);
} else {
alert("no date");
};Run Code Online (Sandbox Code Playgroud)
运行代码片段,您将看到它的工作原理:它将str参数解析为 Date 并在result参数中返回它。请注意,在调用该函数之前result需要将其初始化为空数组[](根据您的需要,它也可以是一个对象)。这是必需的,因为在函数内部您“注入”了该属性。{}.value
现在,您可以使用上面的模式编写一个函数作为您问题中的函数(这也向您展示了如何模拟C# 中已知的新丢弃参数out _:在 JavaScript 中,我们传递[]如下所示):
// create a function similar to C#'s DateTime.TryParse
var DateTime = [];
DateTime.TryParse = function(str, result) {
result.value = new Date(str); // out value
return (result.value != "Invalid Date");
};
// returns false, if odb is no date, otherwise true
function isLegal(odp, errorObj) {
if (DateTime.TryParse(odp, [])) { // discard result here by passing []
// all OK: leave errorObj.value undefined and return true
return true;
} else {
errorObj.value = "ODP failed test foo"; // return error
return false;
}
}
// now test the function
var odp = "xxx01.12.2018xx"; // invalid date
var errorObj = [];
if (!isLegal(odp, errorObj)) alert(errorObj.value); else alert("OK!");Run Code Online (Sandbox Code Playgroud)
此示例的作用是使用result参数传递错误消息,如下所示:
errorObj.value = "ODP 测试失败 foo"; // 返回错误
如果您运行该示例,它将在弹出对话框中显示此消息。
注意:除了使用上面显示的丢弃参数,在 JavaScript 中你还可以使用检查 for undefined,即在函数内部检查
if (result === undefined) {
// do the check without passing back a value, i.e. just return true or false
};
Run Code Online (Sandbox Code Playgroud)
result如果不需要,则可以完全省略作为参数,因此您可以像这样调用它
if (DateTime.TryParse(odp)) {
// ... same code as in the snippet above ...
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48315 次 |
| 最近记录: |