Re: [問題] 關於chrome的問題

看板Ajax作者 (Ryhpezlis)時間6年前 (2018/05/08 01:57), 編輯推噓5(500)
留言5則, 5人參與, 6年前最新討論串2/2 (看更多)
基本上來說是 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

05/08 08:30, 6年前 , 1F
講解得很詳細!
05/08 08:30, 1F

05/08 18:34, 6年前 , 2F
05/08 18:34, 2F

05/09 09:53, 6年前 , 3F
對 沒辦法這樣直接指定改變字串值 你可以用.push()塞進去
05/09 09:53, 3F

05/10 16:16, 6年前 , 4F
推熱心
05/10 16:16, 4F

05/12 10:26, 6年前 , 5F
長知識了
05/12 10:26, 5F
文章代碼(AID): #1Qy9Dy0v (Ajax)
文章代碼(AID): #1Qy9Dy0v (Ajax)