javascript作用域解析

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;

 

posted @ 2017-06-20 17:48  丰城人  阅读(197)  评论(0编辑  收藏  举报