转:javascript变量的作用域
JS中作用域的概念:
表示变量或函数起作用的区域,指代了它们在什么样的上下文中执行,亦即上下文执行环境。Javascript的作用域只有两种:全局作用域和本地作用域,本地作用域是按照函数来区分的。
一、无块级作用域
if(true){
var aa= "bb";
}
console.log(aa); //bb
for(var i = 0; i < 100; i++){
//do
}
console.log(i); //100
从第一题中可以看出来,在{}中执行后,变量并没有被销毁,还是保存在内存中的,因此我们可以访问到的。
二、JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里.
var test = '1111111';
function aa() {
alert(test);
}
function bb() {
var test = '22222222';
aa();
}
bb();//alert(1111111);
三、JS会提前处理function定义式 和var关键字
如下面代码:开始alert(bb); //undefine ,alert(age)//语法报错,这两个有什么区别呢,原因就是后面有var bb =“test”,在初始化的时候提前处理了var 这个关键字,只是这个开始未赋值
将代码修改成这样的,可以看出来
var dd = '11111';
function aa() {
alert(bb);//undefine //在这一步,因为后面有var bb =“test”,在初始化的时候提前处理了var 这个关键字,只是这个开始未赋值
var bb = 'test'; //走到这一步 ,才赋值
alert(bb);//test
var cc = "test1";
alert(age);//语法错误
}
aa();
alert(dd);//11111
alert(cc);//语法报错 因为 函数里面的定义的变量,在函数执行完后就销毁了,不占有内存区域了
但是请注意:
<script>
alert(typeof aa); //结果:undefined
</script>
<script>
function aa() {
alert('yupeng');
}
</script>
这说明js预编译是以段为单元的。
转载http://www.jb51.net/article/30060.htm这篇文章,为了怕他删除,留个备份,并加深自己的理解,
再结合http://www.cnblogs.com/rubylouvre/archive/2009/08/21/1551270.html这个网址看一下,怎么形象的画作用域图,就能形象的理解了