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

作者: zeSil (Ryhpezlis)   2018-05-08 01:57:11
基本上來說是 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
作者: akccakcctw (947)   2018-05-08 08:30:00
講解得很詳細!
作者: sa0124 ((恩恩))   2018-05-09 09:53:00
對 沒辦法這樣直接指定改變字串值 你可以用.push()塞進去
作者: xdraculax (首席怪叔叔)   2018-05-10 16:16:00
推熱心
作者: qoo08577818 (KingJ)   2018-05-12 10:26:00
長知識了

Links booklink

Contact Us: admin [ a t ] ucptt.com