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)
是一样的。
寫完才發現,以下絕大多數的內容是跑題的“參考資料”,是該寫博客的東西。
單看這個例子,確實
null
或undefined
都湊巧不會報錯。不過從JS編程習慣的角度,必須注意:undefined
基本上不該直接用作有效的“值”去賦給變量,雖然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 實現者
在大多數情況下,你隻要把
err
當布爾型就行了。如果你確實糾結它是不是 undefined,那麼請這麼寫:
PS:怎麼今天 SF 的 Markdown 解析這麼詭異。。。
我們來看下callback的執行,在callback的定義裏邊,一般都是這麼寫:
單從這裏邊來看的話,執行callback的時候,
callback()
和callback(undefined)
是一樣的。但是我們一般都會if(!err)
這樣判斷第一個參數,這樣的話,不傳,傳undefined和null都行,隻不過null更具語意化,和Error對象對應,明確指出“無錯誤地執行回調”。