node官方文档给的说明是
The asynchronous form always take a completion callback as its last argument. The arguments passed to the completion callback depend on the method, but the first argument is always reserved for an exception. If the operation was completed successfully, then the first argument will be null or undefined.
在低版本浏览器中undefined值可能被修改,在node中似乎没有这个困扰。
从语义上来说应该传null,但是如果按照这个标准,没有错误也没有返回值的时候就必须要调callback(null)
而不能直接调callback()
了么?
两个混着用会造成多严重的后果?
先放结论:callback()
和callback(null)
是一样的。
首先callback(null)
无疑是正确的用法,null
表示没有错误。
其次,在函数中传undefined或者干脆什么都不传,就像callback()
一样。表示尊重这个参数的默认值。
恰巧,callback
函数的第一个参数的默认值就是null
。
所以callback()
和callback(null)
是一样的。
迷茫2017-04-17 11:06:18
写完才发现,以下绝大多数的内容是跑题的“参考资料”,是该写博客的东西。
单看这个例子,确实null
或undefined
都凑巧不会报错。不过从JS编程习惯的角度,必须注意:
undefined
基本上不该直接用作有效的“值”去赋给变量,虽然JS允许如此。undefined
和干脆留空在语法上是同一语义,而在观感上甚至容易产生语义的歧义。(即看起来你传进去的是undefined
值,但对函数内部而言和不写是一样的。为了实现默认参数,函数可能把undefined
的参数改成别的值)undefined
是白费功夫,不如干脆不写。null
肯定是无歧义的最好办法。有对以下余兴节目感兴趣的,就接着看吧。
太长了!扔进了 http://blog.segmentfault.com/shamiao/1190000000381846
PHP中文网2017-04-17 11:06:18
刚刚在渺哥的博客里讨论了一下,这里整理一下吧。
JavaScript 中并没有 undefined
这个保留字。所以 err == undefined
只是用来判断变量 err
和变量 undefined
的值是不是都「未赋值」——很显然后者是未赋值的。
其实官方文档里的描述可能是一个歧义。它想表达的应该是「第一个参数应当为 null
或未被赋值的」,一个形容词。
因此,callback()
时第一个参数处于未赋值状态,即使你将变量 undefined
赋值了,也不会改变这个情况。
那么 callback()
和 callback(null)
是一样的。
function (err, a, b, c) {
}
在大多数情况下,你只要把 err
当布尔型就行了。
如果你确实纠结它是不是 undefined,那么请这么写:
if (typeof err == 'undefined') {
// ..
}
PS:怎么今天 SF 的 Markdown 解析这么诡异。。。
伊谢尔伦2017-04-17 11:06:18
我们来看下callback的执行,在callback的定义里边,一般都是这么写:
function callback(err) {
console.log(err === undefined);
}
单从这里边来看的话,执行callback的时候,callback()
和callback(undefined)
是一样的。但是我们一般都会if(!err)
这样判断第一个参数,这样的话,不传,传undefined和null都行,只不过null更具语意化,和Error对象对应,明确指出“无错误地执行回调”。