zoukankan      html  css  js  c++  java
  • 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声明和函数表达式来实现.

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

  • 相关阅读:
    JQuery-文档处理&选择器
    JQuery-事件(部分)
    JS中构造函数与函数
    JS中的String.Math.Date
    JS中的_proto_(2)
    JS中的_proto_
    JS中的constructor
    mysql 安装问题
    【转】SpringMVC中DispatcherServlet配置中url-pattern 配置/*和/的区别
    【转】MySql中的函数
  • 原文地址:https://www.cnblogs.com/guoyansi19900907/p/3656942.html
Copyright © 2011-2022 走看看