1、JavaScript的全局变量和局部变量
首先,先来看看js的全局变量和局部变量,js不是块级作用域,所以不能把你学过的C/C++作用域的知识用在js中!
(1)全局变量
var x = 1;
alert(window.x);//弹出1
js的全局变量也可以看做window对象的属性,这句话怎么理解,请看以下代码:
function fn(){
x = 1;
}
fn();
alert(window.x);
结果是什么呢?还是1
这是因为,如果在函数中没有用关键字var定义变量,那么函数中的变量就会变成全局变量。所以结果会是1.
(2)局部变量
在javascript中就只有函数块,函数中定义的变量就是局部变量,但是必须有关键字var!(没有关键字var定义的都是全局变量)。
其他的地方都不是局部变量,比如说if else语句和for循环中创建的变量在外部都可以访问的到
function fn(){
var x = 1;
}
for(var i = 0;i<5;i++){
}
if(i){
var a = 5;
}
fn();
alert(i);
alert(a);
alert(x);//error x is not defined
2、作用域链
什么是作用域链? 每一个函数都有一个作用域, 如果一个函数内部又嵌套链另外一个函数,嵌套的函数也会又一个作用域,这样,嵌套函数就能访问到外部函数中的变量,以及全局作用域中的变量,此时就形成了一条作用域链。
var x = 1;
function fn(){
var y = 2;
function bar(){
var z = 3;
alert(x+y+z);
}
bar();
}
fn();
以上代码运行过程中,在bar函数中没有y和z,执行x+y+z时,javascript搜索x,y,z变量的一种机制就是作用域链,这个例子的搜索顺序:bar->foo->window,即bar函数在执行的过程中,先从自己内部找变量,如果找不到,再从创建当前函数所在的作用域(在fn函数的作用域中找到y,在全局变量中找到x)去找, 以此往上,