如何使我自己的 JavaScript 函数具有必需的参数?
Posted
技术标签:
【中文标题】如何使我自己的 JavaScript 函数具有必需的参数?【英文标题】:How do I make my own JavaScript functions have required parameters? 【发布时间】:2013-09-15 21:32:59 【问题描述】:当我在 intellij idea 中编写 javascript 时,我可以检查我正在调用的函数的参数,它会说类似
我不确定这是否是它了解标准库的 intellij 功能,或者它是否是允许您将参数标记为可选/必需的 javascript 功能。无论哪种方式,我都想了解如何使用可选/必需参数创建自己的函数。我所知道的是 optional 似乎是默认值,因为 Intellij 说我的所有函数参数都是可选的。
从我看到的答案来看,这听起来像是一个 Intellij 功能。但是,现在我想知道 Intellij 是否为我提供了一种将我自己的函数参数标记为可选/必需的方法。
【问题讨论】:
【参考方案1】:const isRequired = () => throw new Error('param is required'); ;
const hello = (name = isRequired()) => console.log(`hello $name`) ;
// These will throw errors
hello();
hello(undefined);
// These will not
hello(null);
hello('David');
【讨论】:
【参考方案2】:我有另一个想法。我在某篇文章中发现了这一点。
创建一个名为required()的函数;
function required(varName)
throw new Error(`$varName is required. `);
当需要一个参数时,只需这样使用:
fnName(a=required("a"), b = required("b"))
....
...
代码示例:
function required(varName)
throw new Error(`$varName is required. `);
function sumOfTwoValues(a= required("a"), b = required("b"))
return a+b
console.log("sumOfTwoValues(1,2): ", sumOfTwoValues(1,2));
console.log("sumOfTwoValues(1): ", sumOfTwoValues(1));
【讨论】:
【参考方案3】:使用 ES6 default function parameters
,你可以实现一个Required
FLAG,当一个带有所需参数的函数在没有提供参数的情况下被调用时,它会抛出错误并停止执行。
// set a getter to a custom global identifier (P_REQUIRED)
Object.defineProperty( window , 'P_REQUIRED' ,
get : ()=>
let err = new Error('');
let trace = err.stack.split('\n');
let msg = '';
for(let i=2;i<trace.length;i++) msg+=trace[i]+'\n';
throw 'Error : Missing required parameter\n' + msg;
,
configurable : false
);
// declare a function with a mandatory parameter
function myFunc( myParam = P_REQUIRED )
/* some code here */
// call the function without the parameters
myFunc();
// Error is thrown!
本质上,P_REQUIRED
由解释器分配给参数,当函数调用中没有指定值时。这会触发 getter 处理程序,它只是准备并抛出一个新的错误。
这是一个干净的跨浏览器解决方案,可以在任何现代环境中运行(需要 ES6)。
我实际上将它打包为一个 javascript 模块。 +信息:https://github.com/colxi/P_REQUIRED
【讨论】:
这应该是答案【参考方案4】:function foo(value1, value2)
/**
* @param myParam1 [Required]
* @param myParam2
*/
if(value1 == undefined)
throw('Value1 is a required field for function foo');
【讨论】:
您确定 Intellij 会使用此代码告诉我 value1 是必需的吗? 这里的基本思想是在函数内部进行参数验证,以便您可以提供自己的自定义、有目的的反馈,这似乎是解决此问题的标准方法...+1跨度> 如果 undefined 是一个有效值,那么它是一个可选参数。 我认为您对 intellij 的询问是因为这些是本机 javascript 函数。除非有某种用于 intellij 自动完成的评论系统,否则你无法做到。 jetbrains.com/idea/webhelp/creating-jsdoc-comments.html 看起来有。但是,您会想要为必填字段添加错误,如图所示,这是一个很好的约定。【参考方案5】:如果您只关心代码完成位,那么您可以在 IntelliJ 环境中使用 JSDoc comments 来获得它。这不会影响您的代码,正如其他人指出的那样,您无法向 JavaScript 解释器指定参数是否是可选的,但编辑器将从注释中获取信息并在您键入时显示它。这样,您自己的函数的显示方式与库函数类似。
【讨论】:
在 jsdoc 中,@param string [somebody]
是可选参数,而 @param string somebody
是必需的 - 搜索 usejsdoc.org/tags-param.html 以查找“可选参数”【参考方案6】:
编辑:如果您要使用 TypeScript 之类的东西,您可以进行这种检查。
如果不对预期的参数进行逐字检查(正如 VoronoiPotato 已经展示的那样),这在 JavaScript 中是不可能做到的。
每个 JavaScript 函数都可以访问 arguments
变量。您可以检查其中是否有任何参数,以及它们是否属于您所期望的类型。
var foo = func(a, b)
if(arguments.length < 2 )
Throw("error");
if(typeof a !== '<expectedtype>' && typeof b !== '<expectedtype>')
Throw("error");
;
【讨论】:
以上是关于如何使我自己的 JavaScript 函数具有必需的参数?的主要内容,如果未能解决你的问题,请参考以下文章
当同一行中的另一个单元格在 Javascript 中具有值时,验证一个单元格是不是成为必需的