javascript作用域问题是js中比较难以判断的问题,关于作用域问题,你需要掌握以下几个要点
1,js是基于对象设计的语言,一切皆对象,函数也是对象,而一切对象都是处在window这个对象下派生出来的
var a=20;
function setAge(){
var a=12;
alert(a);
}
setAge();
alert(a);
实际上上述代码是在window这个对象上添加了全局属性a=20,以及方法setAge(). 而function也是一个对象,下面有自己的属性var a=12以及显示自己属性的alert方法
2,局部变量是在声明在函数之中的,局部变量作用域函数体之中,函数体外无法访问函数体内部变量.
function setAge(){
var a=12;
}
alert(a);//undefined 外部无法访问函数体内部的a
3,没有使用var申明的变量,会被当作全局变量处理
function setAge(){
a=20;
}
setAge();//执行时a=20被推入全局window中执行,相当于说明了全局变量a=20
alert(a);//20
4js中没有区块作用域,在一些其他语言如java中如果有以下代码
if(true){
int age=12
}
int age只会作用于这个{ }区块中,而js中有类似代码,age不单作用于if之中,在function内都可见
function setAge(){
if(true){
var age=20;
}
}
}
5函数内部能够访问外部的变量(局部可访问全局,外部不能访问内部)当运行局部函数需要变量时,首先会查找函数内部有没有该变量,没有则会向外部查找,直到window对象也没有,抛出undfined!
var a=20; function box(){ var b=30; function set(){ var a=40; console.log(a); console.log(b); } return set(); } box();//40,30 console.log(a);//20
运行box()时,打印出a,由于a在函数体set()内有定义,则取出a=40;而b没有定义,b在其上一层box()内有定义,所以取得b=30
再运行console.log(a)时,由于该语句放在了box()外面执行,box()执行完毕后,它之内的变量都会被销毁.所以box()内b 以及set()内的a都销毁了,所以代码最后的
console.log(a)取得的是最外面的全局a=20;