찾다

 >  Q&A  >  본문

node.js - node回调函数的第一个参数error,当没有错误发生的时候,传null好还是undefined好?

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)是一样的。

PHP中文网PHP中文网2781일 전547

모든 응답(5)나는 대답할 것이다

  • 迷茫

    迷茫2017-04-17 11:06:18

    写完才发现,以下绝大多数的内容是跑题的“参考资料”,是该写博客的东西。

    单看这个例子,确实nullundefined都凑巧不会报错。不过从JS编程习惯的角度,必须注意:

    • undefined基本上不该直接用作有效的“值”去赋给变量,虽然JS允许如此。
    • JS的函数参数,传undefined和干脆留空在语法上是同一语义,而在观感上甚至容易产生语义的歧义。(即看起来你传进去的是undefined值,但对函数内部而言和不写是一样的。为了实现默认参数,函数可能把undefined的参数改成别的值)
    • 所以明确写undefined是白费功夫,不如干脆不写。
    • 如果明确传空值,用null肯定是无歧义的最好办法。

    有对以下余兴节目感兴趣的,就接着看吧。


    太长了!扔进了 http://blog.segmentfault.com/shamiao/1190000000381846

    회신하다
    0
  • 阿神

    阿神2017-04-17 11:06:18

    Node.js是服务端的技术,不存在低版本浏览器的问题。大部分人都用callback(null)

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-17 11:06:18

    我觉得用 null 更符合语义一些,null 是变量的内容是空,没有内容的意思,而 undefined 是指变量未定义。

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-17 11:06:18

    刚刚在渺哥的博客里讨论了一下,这里整理一下吧。

    JavaScript 中并没有 undefined 这个保留字。所以 err == undefined 只是用来判断变量 err 和变量 undefined 的值是不是都「未赋值」——很显然后者是未赋值的。

    其实官方文档里的描述可能是一个歧义。它想表达的应该是「第一个参数应当为 null 或未被赋值的」,一个形容词。

    因此,callback() 时第一个参数处于未赋值状态,即使你将变量 undefined 赋值了,也不会改变这个情况。

    如果你是使用者

    那么 callback()callback(null) 是一样的。

    如果你是 API 实现者

    function (err, a, b, c) {
    }
    

    在大多数情况下,你只要把 err 当布尔型就行了。

    如果你确实纠结它是不是 undefined,那么请这么写:

    if (typeof err == 'undefined') {
      // ..
    }
    

    PS:怎么今天 SF 的 Markdown 解析这么诡异。。。

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦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对象对应,明确指出“无错误地执行回调”。

    회신하다
    0
  • 취소회신하다