javascript中不存在块级作用域,所以要小心使用在块级作用域中的函数声明所带来的作用域混乱.

在javascript中函数的作用域是一个非常重要的概念.
javascript中是没有块级作用域,但是有函数作用域的概念.

我们在开发的过程中,经常会遇到这样的问题,

某个函数我暂时不需要,不想声明,只有在特定的场合下,我才需要这个函数.才将这个函数体装载在我们的引擎中来.

 1  function foo(){
 2             return "全局的";
 3           }
 4        function test(x){
 5         var result=[];
 6            if(x){
 7             function foo(){return "局部的";}
 8                result.push(foo());
 9            }
10            result.push(foo());
11            return result;
12        }          
13           alert(test(true));//局部的,局部的
14           alert(test(false));//火狐:全局的  //IE和谷歌:局部的.对于这个地方出项的兼容性问题,我个人的观点是这样的才比较合理.
/*
最后一段代码出项的兼容性问题,我个人呢的观点是这样的觉得比较合理.
如果执行了if语句应该是"局部的".
如果没有执行if语句,结果应该是"全部的"
*/

上面的实例中有一个全局方法foo();
在test方法体中.当参数x为真时,声明一个局部函数,foo();
否则不声明局部函数foo();
很多人可能一开始得出的结论是,[局部的,全局的],[全局的]
其实结果是这样的[局部的,局部的],[全局的]
之所以会得出上面的错误的结论,可能是因为我们把if语句当成了一个有效的作用域.
觉得if语句中的成员不会被外部访问到.
对于上面的代码做一些修改的话,还是很好理解的.

/*

注:今天无意中发现以上的函数声明存在一定的兼容性,不建议大家这样使用^_^

*/

 

 

 1 function foo(){return "全局的";}
 2           function test(x){
 3           var fun=foo,result=[];
 4               if(x){
 5               g=function(){return "局部的";}
 6               result.push(fun());
 7               }
 8               result.push(fun());
 9               return result;
10           }
11           alert(test(true));//全局的,全局的
12           alert(test(false));//全局的

如果你想编写嵌套函数声明,应该将它置于其父元素的最外层.

如果你需要有条件的选择函数,最好办法是使用var声明和函数表达式来实现.

而且这种写法的函数完全可移植.

posted @ 2014-04-10 17:15  思思博士  阅读(1011)  评论(6编辑  收藏  举报