Lidemy / mentor-program-2nd-futianshen

mentor-program-2nd-futianshen created by GitHub Classroom
14 stars 2 forks source link

什麼?JavaScript 的變數不用宣告就可以使用? #25

Open futianshen opened 6 years ago

futianshen commented 6 years ago

為什麼要理解 JavaScript 的宣告變數方式?

緣起

在看完《當我們在學程式時,要學的到底是什麼?》 嚇得屁滾尿流之後,最近都在寫 PHP 的我趕快拾起 JavaScript 去寫寫看文章中提到的一個例題...

一個 199 乘法表,然後輸出的順序要是 0, m, 1, m-1, 2, m-2…以此類推,舉例來說,當要輸出 7 的時候會長這樣: 7 1 = 1 7 9 = 63 7 2 = 14 7 8 = 56 7 3 = 21 7 7 = 49 7 4 = 28 7 6 = 42 7 5 = 35

基於使用 PHP 的習慣寫下了以下程式碼。

for(i=1;i<=19;i++) {
  calc = ''
  calc += i
  calc += '*'
  for (j=1;j<=5;j++) {
    answer = calc
    k= 10-j
    answer += j
    answer += '='
    answer += i * j
    console.log(answer)
    if (j!==k) {
      answer = calc
      answer += k
      answer += '='
      answer += i * k
      console.log(answer)
    }
  }
}

正當我暗自竊喜,還好自己還寫的出來的時候,暮然回首發現,奇怪!好像少了點什麼? calcanswer 怎麼沒有宣告!

在這裡插入一段之前寫 DOM 的時候,一段和上面情況相似的程式碼(這段程式碼的功能是新增一個可以修改留言的輸入框)

div = document.createElement('div')
div.setAttribute("class", "modify")

form = document.createElement('form')
form.setAttribute("action", "modify_post.php")
form.setAttribute("method", "POST")

textarea = document.createElement('textarea')
textarea.setAttribute("name", "modify_content")
textarea.setAttribute("required", "required")
textarea.innerText=postContent

input = document.createElement('input')
input.setAttribute("type", "hidden" )
input.setAttribute("name", "post_id")
input.setAttribute("value", postId)

submit = document.createElement('input')
submit.setAttribute("type", "submit")
submit.setAttribute("class", "btn btn-info")

form.appendChild(textarea)
form.appendChild(input)
form.appendChild(submit)

div.appendChild(form)

變數不用宣告就可以使用 ?

一般變數的宣告分為兩個階段

如果在作用域內沒有宣告,變數就會往外層的作用域找看看有沒有宣告,全域都沒找到,就會在全域的最開端進行宣告,也就是說如果在作用域裡面沒有宣告的變數就會變成全域變數。

這麼方便的話,使用變數的話還要宣告嗎?

如果不宣告會遇到什麼問題 ?

參考資料

JavaScript 語言核心(3)你的變數 var 了嗎? JavaScript 變數 解读ECMAScript[1]——执行环境、作用域及闭包