嵌套的函数(作用域链) 当你进行函数的嵌套时,要注意实际上作用域链是发生变化的,这点可能看起来不太直观。你可把下面的代码置入firebug监视值的变化。 复制代码 代码如下: var testvar = "window属性"; var o1 = {testvar:"1", fun:function(){alert("o1: "+this.testvar+"<<");}}; var o2 = {testvar:"2", fun:function(){alert("o2: "+this.testvar);}}; o1.fun();"1" o2.fun();"2" o1.fun.call(o2);"2"
这是本文的首个例子。 复制代码 代码如下: var testvar = "window属性"; var o3 = { testvar:"3", testvar2:"3**", fun:function(){ alert("o3: "+this.testvar);//"obj3" var inner = function(){ alert("o3-inner: "+this.testvar);//"window属性" alert("o3-inner: "+this.testvar2);//undefined(未定义) }; inner(); } }; o3.fun();
这里我们换了别的函数,这个函数与原先的函数几乎相似但区别是内部函数的写法。要注意的是内部函数运行时所在的作用域,和外部函数的作用域是不一样的。Ext可让你调用函数时指定函数的作用域,避免作用域的问题。 变量的声明 初始化变量时一定要加上“var”关键字,没有的话这就是一个全局变量。譬如,在下面的例子中,会有一个变量写在函数内部,然而你打算仅仅是声明局部的变量,但实际也可能出现覆盖全局变量的值的情形。在FIREBUG "DOM"的标签页中,你可通过检测“window”看到所有的全局变量。如果你发现有“k”或“x”变量那证明你把这个变量分配在一个不合适的作用域里面。见下例: 复制代码 代码如下: var i = 4; var j = 5; var k = 7; var fn = function(){ var i = 6; k = 8;//注意前面没有var 所以这句话的意思的把8赋予到变量k中去! alert(i);//6 alert(j);//5 alert(k+"-1");//8-1 x = 1;//这句的作用有两种情况,创建全部变量x或覆盖(overwrite)全部变量x }; fn(); alert(k+"-2");//8-2 (注意不是7-2)