javascript 变量的作用域

180 阅读3分钟
一、定义:  
  1. 在 javascript 中,变量的定义并不是以代码块作为作用域的,而是以函数作为作用域的。  
  2. 也就是说,如果变量是在某个函数中定义的,那么它在函数以外的地方是不可见的。  
  3. 而如果该变量是定义在 if 或 for 这样的代码块中的,它在在代码块之外是可见的。

二、术语:

  • 全局变量:指的是定义在所有函数之外的变量(定义在全局代码中的变量);
  • 局部变量:指的是在某个函数中定义的变量;

注:函数内的代码可以像访问自己的局部变量那样访问全局变量,反之则不行!

//如:
var global = 1; 
function f(){
    var local = 2;
    global++;
    return global;
}

//调用一下
f();    //2
f();    //3
local   //local is not defined

另外,如果我们声明了一个变量时没有使用  var  语句,该变量就会被默认为全局变量。

//再看个例子:
function f(){
    local = 2;
}

//调用一下local   //undefined
f();
local   //2

由上可以看出,在函数 f( ) 在被调用之前,变量 local 是不存在的,而在函数 f( ) 首次被调用时,变量 local 被创建并赋予全局作用域。那么,它有什么作用呢?

这使我们可以在函数以外的地方去访问它! 

三、变量提升:

//先看个例子:
var a = 123;
function f(){
    alert(a);
    var a = 1;
    alert(a);
}

//调用一下
f();

当函数 f( ) 被调用后,第一个 alert 显示的是 123,第二个 alert 显示的是 1 吗?

其实不然:

当函数 f( ) 被调用后:

第一个 alert 实际上显示的是 undefined ,第二个 alert 显示的是 1 !

那么,为什么第一个 alert 显示的是 undefined 呢?

请记住:

  • 函数域始终优先于全局域!
  • 函数域始终优先于全局域!
  • 函数域始终优先于全局域!

因此,在函数体内(即函数的两个花括号内,如函数 f ( ) { ... }):

局部变量  a 会覆盖掉所有与它同名的全局变量!即,尽管在 alert( ) 第一次被调用时,a 还没有被正式(显式)的定义,但该变量本身已经存在于本地空间了,这种特殊的现象,就叫做提升。

也就是说,当 javascript 执行过程进入到新的函数时,这个函数内被声明的所有变量都会移动到(或者说是被提升到)函数最开始的地方!

而且,被提升的只有变量的声明,这就意味着,只有函数体内声明的这些变量在该函数执行开始时就存在,而与之相关的赋值操作并不会被提升!(例如上面的例子中,局部变量本身,被提升到了函数开始的地方,但并没有在开始处就被赋值为 1 ),那么上面的例子就等同于:

var a = 123;
function f(){
    var a;
    alert(a);
    a = 1;
    alert(a);
}

//执行一下
f();
// 第一次 alert 显示为 undefined  
// 第二次 alert 显示为 1  

本文摘自《JavaScript面向对象编程指南》,分享的目的仅供个人学习和理解,如需转载请备注本文出处,谢谢!