作者zeSil (Ryhpezlis)
看板Ajax
标题Re: [问题] 关於chrome的问题
时间Tue May 8 01:57:11 2018
基本上来说是 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://webptt.com/cn.aspx?n=bbs/Ajax/M.1525715836.A.039.html
1F:推 akccakcctw: 讲解得很详细! 05/08 08:30
2F:推 EPGo: 05/08 18:34
3F:推 sa0124: 对 没办法这样直接指定改变字串值 你可以用.push()塞进去 05/09 09:53
4F:推 xdraculax: 推热心 05/10 16:16
5F:推 qoo08577818: 长知识了 05/12 10:26