🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
在JS中,变量的定义并不是以代码块作为作用域的。而是以函数作为作用域。也就是说,如果变量是在某个函数中定义的,那么它在函数以外的地方是不可见的。 在JS总,全局变量指的是定义在所有函数之外的变量,局部变量则是定义在函数内的变量,函数内的代码可以调用全局变量,反之则不行。 比如说: ``` >>> var global = 1; undefined >>> function f(){ ... var local = 2; ... global++; ... return global; ... } undefined >>> f(); 2 >>> f(); 3 >>> local; Exception: ReferenceError: Can't find variable: local ``` - 函数f()可以访问变量global - 在函数f()以外,变量local是不存在的 如果我们声明一个变量时没有使用var语句,默认是全局变量 ``` >>> function f(){ ... local = 2; ... } undefined >>> local; Exception: ReferenceError: Can't find variable: local >>> f(); undefined >>> local; 2 ``` 在实际开发中: - 尽量将全局变量的数量减到最低,以避免命名冲突。如果有两个人在同一段脚本的不同函数中使用了相同的全局变量名,就很容易导致不可预测的结果和难以察觉的bug。 - 最哈总是使用var语句来声明变量 - 可以考虑使用“单一 var”模式,也就是在函数体内第一行使用var来定义这个作用域中的所需的变量 变量提升 ``` var a = 123; function f(){ alert(a); var a = 1; alert(a); } f(); ``` 第一次弹出undefined,第二次弹出1. 因为函数域使用优先于全局域,所以局部变量a会覆盖所有与他同名的全局变量,尽管alert()第一次被调用时,a还没有被正式定义,但该变量本身已经存在与本地空间了。这种特殊的现象我们叫做提升(hoisting)。 这个概念很重要,也就是说,当JS执行过程中进入新的函数时,这个函数内被声明的所有变量都会被提升。 被提升的只有变量的声明,与之相关的赋值操作并不会被提升。比如说刚才的demo中,局部变两本书被提升到了函数最开始处,但并没有在开始处就被赋值1。 上面的demo可以改成: ``` var a = 123; function f(){ var a; alert(a); var a = 1; alert(a); } f(); ```