node.js - node回调函数的第一个参数error,当没有错误发生的时候,传null好还是undefined好?
PHP中文网
PHP中文网 2017-04-17 11:04:18
0
5
580

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中文网

认证0级讲师

全部回覆(5)
迷茫

寫完才發現,以下絕大多數的內容是跑題的“參考資料”,是該寫博客的東西。

單看這個例子,確實nullundefined都湊巧不會報錯。不過從JS編程習慣的角度,必須注意:

  • undefined基本上不該直接用作有效的“值”去賦給變量,雖然JS允許如此。
  • JS的函數參數,傳undefined和幹脆留空在語法上是同一語義,而在觀感上什至容易產生語義的歧義。 (即看起來你傳進去的是undefined值,但對函數內部而言和不寫是一樣的。為了實現默認參數,函數可能把undefined的參數改成別的值)
  • 所以明確寫undefined是白費功夫,不如幹脆不寫。
  • 如果明確傳空值,用null肯定是無歧義的最好辦法。

有對以下餘興節目感興趣的,就接著看吧。


太長了!扔進了 http://blog.segmentfault.com/shamiao/1190000000381846

阿神

Node.js是服務端的技術,不存在低版本瀏覽器的問題。大部分人都用callback(null)

小葫芦

我覺得用 null 更符合語義一些,null 是變量的內容是空,沒有內容的意思,而 undefined 是指變量未定義。

洪涛

剛剛在渺哥的博客裏討論了一下,這裏整理一下吧。

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 解析這麼詭異。。。

伊谢尔伦

我們來看下callback的執行,在callback的定義裏邊,一般都是這麼寫:

function callback(err) {
    console.log(err === undefined);
}

單從這裏邊來看的話,執行callback的時候,callback()callback(undefined)是一樣的。但是我們一般都會if(!err)這樣判斷第一個參數,這樣的話,不傳,傳undefined和null都行,隻不過null更具語意化,和Error對象對應,明確指出“無錯誤地執行回調”。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板