1、JavaScript的全局变量和局部变量
(1) 全局变量
js的全局变量也可以看做window对象的属性。
如果在函数中定义变量时没有用关键字var,那么实际上定义的就是全局变量。
(2)局部变量
要说块级作用域,那么在js中就只有函数块,函数中定义的变量就是局部变量,当然必须有关键字var!(没有关键字var定义的都是全局变量)
也就是说if else语句和for循环中创建的变量在外部都可以访问的到
<pre>function foo(){ var x = 1;
} for(var i = 0;i<10;i++){
} if(i){ var y = 10;
}
foo();
alert(i);//10
alert(y);//10
alert(x);//error x is not defined</pre>
2、作用域链
<pre>var x = 1; function foo(){ var y = 2; function bar(){ var z = 3;
alert(x+y+z);
}
bar();
}
foo();</pre>
在bar函数中没有y和z,执行x+y+z时,js搜索x,y,z变量的一种机制就是作用域链,这个例子的搜索顺序:bar->foo->window
bar的作用域链是:
<pre>**barScopeChain = [
bar.AO,
foo.AO,
global.VO
];**</pre>
foo的作用域链是:
<pre>fooScopeChain = [
foo.AO,
global.VO
];</pre>
在函数执行过程中,每遇到一个变量,都会检索从哪里获取和存储数据,该过程从作用域链头部,也就是从活动对象开始搜索,查找同名的标识符,如果找到了就使用这个标识符对应的变量,如果没有则继续搜索作用域链中的下一个对象,如果搜索完所有对象都未找到,则认为该标识符未定义,函数执行过程中,每个标识符都要经历这样的搜索过程。