日期:2014-05-16  浏览次数:20405 次

js中作用域链的问题

先来看一个列子:

?

<script type="text/javascript">
/*
 * js函数是一个对象,scope是仅供js引擎访问的内部属性,包括创建对象属性的集合
 * 当一个函数创建后它的作用域链被填充,
 * 每个内部对象是独一的,所以多次调用一个函数会导致多次创建
 * 当函数运行过程中遇到一个变量要搜索作用域,
 */ 
var tt = 'aa';
function test() {
	alert(tt);
	var tt = 'bb';
	alert (tt);

}
test();
</script>

?看这段代码第一个alert(tt)弹出的是undefined 第二个弹出的是 'bb',而外面定义的'aa'那?我们都知道js中的定义用var来声明,外面的'aa'为全局变量,按照js的顺序执行过程第一个alert应该弹出'aa'.但实际弹出的是'undefined',这是为什么那?

这就是js的作用域对象起的作用,当每个函数在调用的时候都会生成一个独立的域对象,也就是运行时上下文,这个域对象包括了两部分,第一部分是函数自身声明的对象,另一部分是js对象自身的属性,在函数执行过程中当遇到一个变量的时候,查找的顺序也是从前端想后深入查找,当查找不到的时候就返回'undefined'。而这个地方外面定义的'aa'在第一场alert()的时候为什么没有被找到,这是因为在函数里面有定义了var tt = 'bb',这样在在作用域那他的优先级比较高,而在第一次调用的时候tt = 'bb'没有被定义,所以第一次alert()会弹出 'undefined'.

我们在写js的时候尽量减少变量搜索的深度,多用局部变量代替全局变量,或是声明一个全局变量对象,把用到的变量都看作对象的一个属性来访问。

?

 var myParameter = {
       aa : '123',
       bb : 'dfdf'
}

myParameter.cc = 'nihao';