先来看一个列子:
<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';