起因:代码review中暴露出的一个突出严重的问题–函数参数缺少检测。故找同事讨论一下这个小小话题。下面是我从讨论中总结出的点。
1、那么首先为什么要做函数参数的检测呢?
让js代码更健壮!
2、函数参数的检测是必须的吗?
严格的来讲是建议任何只要有参数的地方就需要检测,理由:任何的输入操作都是不可靠的,尤其是对javascript这种弱类型的语言来说。
简单来做呢,供外部调用的接口参数进行检测很必要,因为不能确保外部怎么用;内部的方法参数可以按约定,省略检测,可以提高一些性能。
3、然后,该怎么做呢?从哪方面着手呢?
对参数的存在性和类型检测的检测是基础。参数个数的检测根据代码逻辑来判断是否加以检测,与代码设计相关,不是必须要做的。
存在性和类型的检测可以通过,如下:
1
2
3
|
if
(param &&
typeof
param ==
'xxx'
){
}
|
一些js框架提供一些api来检测,如:KISSY 的 isObject()、isArray()等,jQuery的isFunction()、isPlainObject()等。
参数个数,通过函数的arguments.lenght来获得实际传入函数的参数个数。函数的形参个数可以通过函数的length属性获得(arguments.callee.length)。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
function
check(args) {
var
actual = args.length,
//the actual number of arguments
expected = args.callee.length;
//the expected number of arguments
if
(actual != expected) {
//throw an exception if they do not match
thow
new
Error(
'wrong number of arguments: expected: '
+ expected +
'; actually passed '
+ actual);
}
}
function
f(x, y, z) {
//check that the actual # of args matches the expected # of args
//thow an exception if they do not match
check(arguments);
//now do the reset of the function normally
return
x + y + z;
}
|
4、接下来处理检测结果,此处阐述检测出错的处理。
出错后一般会return false,但建议在返回前多做一步,打log。log帮助调用函数的使用者,知道哪里出错,帮助快速定位问题。KISSY的debug模式在开启的情况下输出日志,这种处理也不错。
大家有什么观点、想法,欢迎评论~!