摘要:問題碰到了一個(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
摘要:函數(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...
摘要:函數(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ī)范 ...
摘要:花點(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)的末尾...
摘要:如果你想了解更多關(guān)于強(qiáng)制類型轉(zhuǎn)換的信息,你可以讀一讀的這篇文章。在只使用的情況下,所帶來的強(qiáng)制類型轉(zhuǎn)換使得判斷結(jié)果跟蹤變得復(fù)雜,下面的例子可以看出這樣的結(jié)果有多怪了明智地使用真假判斷當(dāng)我們在一個(gè)條件語句中使用變量或表達(dá)式時(shí),會(huì)做真假判斷。 說明 如果本文檔中有任何錯(cuò)誤的、不符合行規(guī)的,敬請斧正。 引言 不管有多少人共同參與同一項(xiàng)目,一定要確保每一行代碼都像是同一個(gè)人編寫的。...
摘要:我將上面校驗(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...
閱讀 1277·2023-04-25 19:10
閱讀 1154·2021-09-10 10:50
閱讀 3040·2021-09-02 15:21
閱讀 1397·2019-08-30 15:52
閱讀 1694·2019-08-30 13:56
閱讀 2097·2019-08-30 12:53
閱讀 1880·2019-08-28 18:22
閱讀 2134·2019-08-26 13:47