js variable scope
变量作用域
变量的作用域无非就是两种:全局变量和局部变量。
长期以来我一直以为用var关键字声明的就是局部变量,直接声明的就是全局变量。
直到我在项目中发现在代码开头部分用var关键字声明的变量居然是全局变量,
我深刻记得当初这个发现给我自己带来的震惊,
长期地写业务代码真的并不能成比例地提高技术水平。
因为我发现很多人和当初的我一样,都搞不清这个变量作用域,
体现在代码中就是你经常看到全局变量,这是一种因为不深入原理,所以采用这种简单粗暴的解决方式。
因为搞不清变量作用域,为了自己开发方便,直接声明全局变量,丝毫不考虑这会给后期维护带来什么后果。
去看js权威指南后发现,var仅仅是个关键字而已,它本身没有任何意义,它并不能决定变量是全局还是局部。
决定变量是全局还是局部的是变量所处的作用域,
如果是在最外层或在块语句中,用var声明的就是全局变量,
而如果是在函数中,用var声明的就是局部变量。
es6引入了全新的关键字(let)来声明变量,我们不禁要问为什么?
难道仅仅是因为js只有函数作用域,没有块级作用域吗?
那我们继续追问,为什么要引入块级作用域?
如果你搞不清这个问题,你可以从自己熟悉的角度来提问:为什么要有函数作用域?
如果没有函数作用域,那js中就没有局部变量了,全部是全局变量,甭管是否用var声明。
也就是说函数作用域存在的目的就是为了减少全局变量的使用。
当你搞清楚了为什么要有函数作用域也就搞清楚了es6为何要引入块级作用域。
没错,它们俩的目的都是一样:创建局部变量环境,减少全局变量的使用。
for(var i=0;i<10;i++){ |
为何要减少全局变量的使用?
一、团队协作
在web开发的初期,前端的功能并不复杂,一个js通常是一个人开发维护,代码量也不多,
所以为了简单方便,大量使用全局变量也没什么大问题。
但在web开发的今天,前端的功能越来越复杂,一个js通常是好几个人开发维护,代码量惊人。
如果这时还大量使用全局变量,你会发现团队根本无法合作。
二、性能优化
for(var i=0;i<10;i++){ |
全局变量是内存杀手,是内存泄露之源,这在前端表现得还不明显,
在后端node.js中,随便一个内存溢出就会服务器资源占用率居高不下。