先決條件: | 基本的計算機素養(yǎng),基本了解HTML和CSS,了解JavaScript是什么。 |
---|---|
目的: | 獲得能力和信心開始修復自己的代碼中的簡單問題。 |
? ? ?一般來說,當你在代碼中做錯了,你會遇到兩種主要的錯誤類型:
好了,這是不是很是簡單-因為你更深入的研究也有一些其他的差異化。但上述分類將在你的職業(yè)生涯的這個早期階段做。我們將看看這兩種類型。
開始,讓我們回到我們的猜測游戲 - 除了這一次,我們將探索一個版本,有一些故意錯誤介紹。轉(zhuǎn)到Github上,讓自己的本地拷貝數(shù)游戲errors.html(看到它在這里住上運行)。
注意:您可能也有自己的游戲不工作,您可能要修正!我們?nèi)匀幌M軌蚴褂梦覀兊陌姹緛硗瓿蛇@篇文章,以便您可以學習我們在這里教授的技術(shù)。然后你可以回去,嘗試修復你的例子。
此時,讓我們打開開發(fā)者控制臺,看看我們是否可以有語法錯誤,然后嘗試修復它們。你會學到如何修復。
早年在過程中,我們得到了你輸入一些簡單的JavaScript命令到開發(fā)工具JavaScript控制臺(如果你不記得如何在瀏覽器中打開此,按照前面的鏈接了解如何 F12.)。更有用的是,當JavaScript進入瀏覽器的JavaScript引擎時,如果存在語法錯誤,控制臺會提供錯誤消息?,F(xiàn)在讓我們?nèi)タ匆豢础?/p>
在谷歌瀏覽器打開errors.html
中打開,并打開JavaScript控制臺(默認F12)。您應該會看到以下行中的錯誤消息:
guessSubmit.addeventListener('click', checkGuess);
addEventListener()
。addeventListener
到addEventListener
解決這個問題。現(xiàn)在。注:請參閱我們的類型錯誤:"x"是不是一個函數(shù)有關此錯誤的詳細情況參考頁。
Null
是一個特殊值,意思是"無",或者"無值"。因此,lowOrHi
已申報和初始化,但不與任何有意義的價值-它沒有任何類型或值。checkGuess() { ... }
塊)。正如你將在后面的函數(shù)文章中更詳細地學到的,代碼里面的函數(shù)運行在一個單獨的范圍內(nèi)來編寫外部函數(shù)。在這種情況下,代碼沒有運行并且沒有被拋出的誤差,直到checkGuess()
函數(shù)由線86上運行。lowOrHi.textContent = 'Last guess was too high!';
textContent
的中lowOrHi
變量為一個文本字符串,但它不工作,因為lowOrHi
不包含什么它應該操作不了。讓我們來看看這是為什么-嘗試搜索的其他實例lowOrHi
中的代碼。你在JavaScript中找到的最早的例子是第48行: var lowOrHi = document.querySelector('lowOrHi');
null
運行后。在第49行添加以下代碼: console.log(lowOrHi);
注意:console.log()
是一個非常有用的調(diào)試功能,打印的值到控制臺。所以它會打印的價值lowOrHi
,快速的打印到控制臺,我們曾試圖將其設置為48行。
console.log()
的結(jié)果在控制臺。 果然,lowOrHi
的值是null
在這一點上,所以絕對沒有48中的問題。document.querySelector()
方法與CSS選擇器選擇它去一個元素的引用。進一步查看我們的文件,我們可以找到有問題的段落: <p class="lowOrHi"></p>
querySelector()
方法中管線48沒有圓點。這可能是問題!嘗試改變lowOrHi
,以.lowOrHi
行號48。console.log()
說法應該返回<p>
我們想要的元素。!!另一個錯誤修復!您可以刪除您console.log()
,或保持在隨后參考-你的選擇。注:請參閱我們的類型錯誤:"x"是(不)"Y"參考有關此錯誤的更多詳細信息頁面。
addeventListener
為addEventListener
?,F(xiàn)在做這個。在這一點上,游戲進行得很順利。但經(jīng)過幾次你一定會注意到你要猜測的這個隨機數(shù)總是1。毋庸置疑,我們不想這么玩游戲!
可以確定的是,某處游戲的邏輯出現(xiàn)了問題——游戲并沒有返回錯誤;它只是不能正確地運行。
var randomNumber = Math.floor(Math.random()) + 1;另一個在隨后的每一次游戲前形成的隨機數(shù)實例應該在113行:
randomNumber = Math.floor(Math.random()) + 1;
console.log(randomNumber);
確定了這個,讓我們來思考這行代碼如何工作。首先,我們調(diào)用 Math.random()
,它生成一個在0和1之間的十進制隨機數(shù),例如 0.5675493843。
Math.random()
接下來,我們把調(diào)用Math.random()的結(jié)果作為參數(shù)傳遞給Math.floor(),它會向下舍入到與它最接近的
整數(shù)。然后我們給這個結(jié)果加上1:
Math.floor(Math.random()) + 1
舍入介于?0?和?1?下的之間的十進制隨機數(shù)將總是返回?0,所以加1之后它總是返回1。我們需要在它舍入之將它前乘以100。那么接下來的結(jié)果就是0到99之間的隨機數(shù)了:
Math.floor(Math.random()*100);
昂斯想要我們加1,才給我們一個1到100之間的隨機整數(shù):
Math.floor(Math.random()*100) + 1;
試著像這樣更新這兩行,然后保存并刷新——現(xiàn)在游戲應該是我們期望的那樣了!
還有其他常見錯誤,你會在代碼中遇到。 本節(jié)重點介紹其中的大部分。
這個錯誤通常意味著你在一行代碼的末尾錯過了一個冒號,但有時它會更加隱秘。 例如,如果我們在 checkGuess()
函數(shù)中更改此行:
var userGuess = Number(guessField.value);
至
var userGuess === Number(guessField.value);
它拋出這個錯誤,因為它認為你正在嘗試做不同的事情。 你應該確保不要使用strict等于運算符混合賦值運算符( =
) - 它設置一個變量等于一個值( === code>),它測試一個值是否等于另一個值,并返回
true
/ false
結(jié)果。
請注意:請參閱我們的語法錯誤:missing; before語句參考頁,以獲取有關此錯誤的更多詳細信息。
這可能是混淆賦值和嚴格相等運算符的另一個癥狀。 例如,如果我們在 checkGuess()
中更改此行:
if (userGuess === randomNumber) {
至
if (userGuess = randomNumber) {
測試總是返回true,所以程序報告游戲已經(jīng)贏了。 小心!
這很簡單 - 通常意味著你錯過了一個函數(shù)/方法調(diào)用結(jié)束時的右括號。
注意:請參閱參數(shù)列表后的 SyntaxError:missing) 參考頁,了解有關此錯誤的更多詳細信息。
這個錯誤通常與一個不正確形成的JavaScript對象有關,但在這種情況下,我們設法通過更改獲得它
function checkGuess() {
至
function checkGuess( {
這導致瀏覽器認為我們試圖將函數(shù)的內(nèi)容作為參數(shù)傳遞到函數(shù)中。 小心這些括號!
這很容易 - 通常意味著你從一個函數(shù)或條件結(jié)構(gòu)中錯過了一個花括號。 我們通過刪除 checkGuess()
函數(shù)底部附近的一個關閉花括號來獲得此錯誤。
這些錯誤通常意味著您錯過了字符串值的開頭或結(jié)尾引號。 在上面的第一個錯誤中, string 將替換為瀏覽器找到的意外字符,而不是字符串開頭的引號。 第二個錯誤表示字符串尚未以引號標記結(jié)束。
對于所有這些錯誤,想想我們?nèi)绾翁幚砦覀冊谘菥氈锌吹降睦印?/span> 當出現(xiàn)錯誤時,查看您給出的行號,轉(zhuǎn)到該行,看看是否可以發(fā)現(xiàn)錯誤。 記住,錯誤不一定是在那行,也錯誤可能不是由上面提到的完全相同的問題引起的!
注意:請參閱我們的語法錯誤:意外令牌 >和 SyntaxError:unterminated string literal 參考頁面了解有關這些的更多詳細信息 錯誤。
所以我們有它,在簡單的JavaScript程序中找出錯誤的基礎。 它不總是那么簡單,弄清楚你的代碼有什么問題,但至少這將節(jié)省你幾個小時的睡眠,并允許你進步一點,當事情沒有出現(xiàn)在你的學習之前 。
更多建議: