看板 Ajax 關於我們 聯絡資訊
基本上來說是 name 宣告後被其他機制複寫 而變數會被複寫,代表有其他地方在操作這個變數 也就是涉及變數作用範圍 scope 的問題 從這段code裡面,name 是用 var 需告, 並且沒有被放置在任何函數底下,是被放置在函數外的 基本上他會是個全域變數 而在瀏覽器環境底下,全域方法或者變數,就是直接在 window 物件底下 所以當你設定一個 name 的全域變數,是等價於 window.name 如同 nodejs 環境是掛載在 global 物件底下 global object 這部分可以參考 https://developer.mozilla.org/en-US/docs/Glossary/Global_object 那為何 name 明明被宣告成陣列,卻被轉為字串? 原因在於 window.name 他被預期是一個字串 而瀏覽器會用 toString 方法將所有他的賦值轉成字串 window.name 可參考 mozilla 文件: https://developer.mozilla.org/en-US/docs/Web/API/Window/name 所以瀏覽器處理 var name = new Array(10); 其實他執行的是 var name = new Array(10); name = name.toString(); 並且字串並沒有提供 a[...] 來改變字串值的方法 底下的 name[...] = ... 都是沒有作用的 最後才會得到 ,,,,,,,,, 至於 chrome 不能,IE 可以,則是前端另一個坑 只要是涉及瀏覽器執行或顯示的,例如JS/CSS 可能會隨著瀏覽器種類以及版本,會有些微不同的表現... 最後如果真的要用 name 這個變數怎辦? 那就把他包在 function 裡面,讓 name 變成 local variable https://imgur.com/YxlNJCq 或者使用 es6 語法的 let, const 來宣告 避免 var 有全域變數的問題 https://imgur.com/ZOnSumE -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.163.177.148 ※ 文章網址: https://www.ptt.cc/bbs/Ajax/M.1525715836.A.039.html
akccakcctw: 講解得很詳細! 05/08 08:30
EPGo: 05/08 18:34
sa0124: 對 沒辦法這樣直接指定改變字串值 你可以用.push()塞進去 05/09 09:53
xdraculax: 推熱心 05/10 16:16
qoo08577818: 長知識了 05/12 10:26