成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

對一個(gè)分號(hào)引發(fā)的錯(cuò)誤研究

khs1994 / 2303人閱讀

摘要:問題碰到了一個(gè)很詭異的問題,函數(shù)明明定義了,卻報(bào)錯(cuò)說函數(shù)沒定義,代碼如下報(bào)錯(cuò)信息測試環(huán)境解決后來經(jīng)過提問和查找資料大概明白了其中的緣由,故寫此文。但自調(diào)用函數(shù)求值過程中遇到時(shí),還沒有值,所以會(huì)報(bào)的錯(cuò)誤。此時(shí),真相大白。感悟不要省略分號(hào)感謝

問題

碰到了一個(gè)很詭異的問題,函數(shù)明明定義了,卻報(bào)錯(cuò)說函數(shù)沒定義,代碼如下:

jsvar x = 0;
var foo = function(callback){
  return window.setTimeout(callback, 17);
}  
(function sayX(){
  x += 1;
  console.log(x);
  foo(sayX);
}())

報(bào)錯(cuò)信息: Uncaught TypeError: foo is not a function
測試環(huán)境: chrome 44.0.2403.130 m

解決

后來經(jīng)過提問,和查找資料, 大概明白了其中的緣由,故寫此文。

這個(gè)問題涉及到一個(gè)"自動(dòng)分號(hào)插入",具體到這個(gè)問題,就是:
1. 函數(shù)聲明會(huì)自動(dòng)插入引號(hào);
2. 函數(shù)表達(dá)式不會(huì)自動(dòng)插入分號(hào);

function foo() {
}  // 函數(shù)聲明會(huì)自動(dòng)添加分號(hào),不需要添加分號(hào)

var foo = function() {
}; // 函數(shù)表達(dá)式不會(huì)自動(dòng)添加分?jǐn)?shù),最好添加分號(hào)

具體到這個(gè)問題,由于foo 函數(shù)表達(dá)式后面沒有分號(hào),于是代碼等價(jià)于:

jsvar x = 0;
var foo = function(callback){
  return window.setTimeout(callback, 17);
}(function sayX(){
  x += 1;
  console.log(x);
  foo(sayX);
}())
  

插播一條知識(shí)點(diǎn):
函數(shù)表達(dá)式后面跟括號(hào)就會(huì)對觸發(fā)函數(shù)執(zhí)行,比如

var foo = function(x){
  return x;
}(10)  

最終 foo 的值是 10 ,而不是函數(shù)

回到這個(gè)問題, 自調(diào)用函數(shù)會(huì)首先取值, 然后傳入函數(shù)求值,返回給foo。
但自調(diào)用函數(shù)求值過程中遇到 foo(sayX)時(shí),foo還沒有值,所以會(huì)報(bào)Uncaught TypeError: foo is not a function的錯(cuò)誤。

此時(shí),真相大白。

感悟

不要省略分號(hào).

感謝

http://segmentfault.com/q/1010000003074238

http://justjavac.iteye.com/blog/1852405

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85882.html

相關(guān)文章

  • JavaScript-總結(jié)常用代碼書寫規(guī)范

    摘要:函數(shù)聲明應(yīng)該在作用域的頂層。數(shù)組和對象字面量用數(shù)組和對象字面量來代替數(shù)組和對象構(gòu)造器。數(shù)組構(gòu)造器很容易讓人在它的參數(shù)上犯錯(cuò)。推薦對象構(gòu)造器不會(huì)有類似的問題,但是為了可讀性和統(tǒng)一性,我們應(yīng)該使用對象字面量。 javascript 代碼規(guī)范 代碼規(guī)范我們應(yīng)該遵循古老的原則:能做并不意味著應(yīng)該做。 全局命名空間污染 總是將代碼包裹在一個(gè)立即的函數(shù)表達(dá)式里面,形成一個(gè)獨(dú)立的模塊。 不推薦 va...

    Berwin 評論0 收藏0
  • Coding Standard

    摘要:函數(shù)聲明應(yīng)該在作用域的頂層。數(shù)組和對象字面量用數(shù)組和對象字面量來代替數(shù)組和對象構(gòu)造器。數(shù)組構(gòu)造器很容易讓人在它的參數(shù)上犯錯(cuò)。推薦對象構(gòu)造器不會(huì)有類似的問題,但是為了可讀性和統(tǒng)一性,我們應(yīng)該使用對象字面量。 Coding Standards 轉(zhuǎn)載自掘金 作者:Sivan 簡介:前端開發(fā)的老新人,原生JavaScript的愛好者,致力做一名專業(yè)的開發(fā)者 javascript 代碼規(guī)范 ...

    xiaochao 評論0 收藏0
  • 【知識(shí)點(diǎn)】Javascript分號(hào)規(guī)則

    摘要:花點(diǎn)時(shí)間搞清楚中的分號(hào)規(guī)則吧不管你喜歡結(jié)尾帶分號(hào)或省略分號(hào)的模式分號(hào)允許的場景分號(hào)一般允許出現(xiàn)在大部分語句的末尾,比如等栗子僅有一個(gè)分號(hào)可以表示空語句在中合法,比如可解析為三個(gè)空語句空語句可用于輔助產(chǎn)生語法合法的解析結(jié)果,如如果沒有末尾的 花點(diǎn)時(shí)間搞清楚JS中的分號(hào)規(guī)則吧~~~不管你喜歡結(jié)尾帶分號(hào)或省略分號(hào)的模式 分號(hào)允許的場景 分號(hào)一般允許出現(xiàn)在大部分語句(statement)的末尾...

    kun_jian 評論0 收藏0
  • JavaScript 編寫規(guī)范

    摘要:如果你想了解更多關(guān)于強(qiáng)制類型轉(zhuǎn)換的信息,你可以讀一讀的這篇文章。在只使用的情況下,所帶來的強(qiáng)制類型轉(zhuǎn)換使得判斷結(jié)果跟蹤變得復(fù)雜,下面的例子可以看出這樣的結(jié)果有多怪了明智地使用真假判斷當(dāng)我們在一個(gè)條件語句中使用變量或表達(dá)式時(shí),會(huì)做真假判斷。 說明 如果本文檔中有任何錯(cuò)誤的、不符合行規(guī)的,敬請斧正。 引言 不管有多少人共同參與同一項(xiàng)目,一定要確保每一行代碼都像是同一個(gè)人編寫的。...

    MartinDai 評論0 收藏0
  • 驚爆!一行正則表達(dá)式引發(fā) CPU 慘案

    摘要:我將上面校驗(yàn)的正則表達(dá)式的第二部分后面加多了個(gè)號(hào),即變成這樣這里加了個(gè)號(hào)這樣之后,運(yùn)行原有的程序就沒有問題了。 正則表達(dá)式是程序員經(jīng)常使用的工具之一。本文作者通過一個(gè)正則表達(dá)式的陷阱,先深入剖析了出現(xiàn)問題的原因,后給出怎么處理這類問題的方法。最后還給出了一些檢測常見正則表達(dá)式問題的工具,十分值得深入研究。前幾天線上一個(gè)項(xiàng)目監(jiān)控信息突然報(bào)告異常,上到機(jī)器上后查看相關(guān)資源的使用情況,發(fā)現(xiàn) CPU...

    Faremax 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<