Re: [問題] 關於chrome的問題
基本上來說是 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
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
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
0
2
Ajax 近期熱門文章
PTT數位生活區 即時熱門文章