javascript学习笔记之——变量的作用域

  在学习变量的作用域之前要先知道,在JS中,变量的定义不是以代码块作为作用域,而是以函数作为作用域。也就是说,如果变量是在某个函数中定义的,那么它在函数以外的地方是不可见的。而如果该变量定义在if或者for这样的代码块中,它在代码块之外是可见的。另外,在JS中,“全局变量”值的是定义在所有函数之外的变量(也就是定义在全局代码中的变量),而与之相对的是“局部变量”,所指的则是在某个函数中定义的变量。其中,函数内的变量可以像访问自己的局部变量那样访问全局变量,反之则不行

  eg1:

    

  eg2:

    

  首先我们在函数f()中定义了一个变量local.在该函数没有调用之前,这个变量是不存在的。该变量在函数首次被调用时创建,并被赋予全局作用域。这使得我们可以在该函数以外的地方访问它。

  1.最佳实践

    (1).尽量将全局变量的数量降到最低,以避免命名的冲突。因为如果有两个人在同一段脚本的不同函数中使用了相同的全局变量名,就很容易导致不可预测的结果和难以察觉的Bug。

    (2).最好总是使用'var'来声明变量

    (3).可以考虑使用单一的“var”模式。即仅在函数体内的第一行使用一个“var”来定义这个作用域中需要的变量。这样一来,我们就可以很轻松的找到相关的变量的定义,并且很大程度上的避免了小心污染全局变量的情况。

  2.变量提升

     eg1:

        

   你可能会想当然的认为alert第一次显示的是123(也就是全局变量a的值),第二次显示的是1234(也就是函数fn内部a的值)。但事实并非如此,第一个alert()实际上显示的undefined,这就是因为函数域始终优先于全局域,所以局部变量a会覆盖掉所有与它同名的全局变量,尽管在alert()第一次被调用时,a还没有被正式定义(即该值为undefined),但该变量本身已经存在于本地空间了。这种特殊的现象叫做提升。

   也就是说,当JS执行进入新的函数时,这个函数内被声明的所有变量都会被移动(或者说提升)到函数最开始的地方。这个概念很重要。必须牢记。另外需要注意的就是,被提升的只有变量的声明,这意味着,只有函数体内声明的这些变量在该函数执行开始时就已经存在,而与之相关的赋值操作并不会被提升,它还在其原来的位置上。譬如在前面的例子中,局部变量本身被提升到了函数开始处,但并没有在开始处就被赋值为1234;

  所以说eg1等价于:

        

 

  

 

posted @ 2016-08-09 14:46  期待已久  阅读(129)  评论(0)    收藏  举报