一、定义:
- 在 javascript 中,变量的定义并不是以代码块作为作用域的,而是以函数作为作用域的。
- 也就是说,如果变量是在某个函数中定义的,那么它在函数以外的地方是不可见的。
- 而如果该变量是定义在 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面向对象编程指南》,分享的目的仅供个人学习和理解,如需转载请备注本文出处,谢谢!