【JavaScript高级程序设计】11、函数表达式(1))

1、递归

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>

    <script type="text/javascript">
        
        //关于递归,由于JavaScript中的函数可以作为一个对象赋值给相应的变量
        //所以在递归的时候最好不使用函数名来做递归调用对象
        function factorial(num)
        {
            if(num <= 1)
            {
                return 1;
            }
            else
            {
                return num * factorial(num - 1);
            }
        }

        //这个就是一个典型的递归求阶乘,但是有一个问题,如果函数名被作为一个变量使用的时候就会出问题
        var anotherFactorial = factorial;
        factorial = null;
        alert(anotherFactorial(4));    //这里就会出错,因为函数里面要调用的num * factorial(num - 1)而factorial已经为null

        //借助arguments.callee(num - 1)函数可以避免函数名的调用
        function factorial(num)
        {
            if(num <= 1)
            {
                return 1;
            }
            else
            {
                return num * arguments.callee(num - 1);
            }
        }

    </script>

 </head>
 <body>
  
 </body>
</html>

 

因为下面那个函数吧上面的屏蔽掉了,所以就会有结果,如果把第二个函数去掉就会报错

 

2、闭包与变量

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>

    <script type="text/javascript">
        
        function createFunctions()
        {
            var result = new Array();
            
            for(var i = 0; i < 10; ++i)
            {
                result[i] = function()
                            {
                                return i;
                            };
            }
            
            return result;
        }
    
        var func = createFunctions();

        //every function outputs 10
        for (var i=0; i < func.length; i++)
        {
            document.write(func[i]() + "<br />");
        }

        

    </script>

 </head>
 <body>
  
 </body>
</html>

 

为了避免引用数据

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>

    <script type="text/javascript">
        
        //如果是引用的话为了避免值被修改

        function createFunctions()
        {
            var result = new Array();
            
            for(var i = 0; i < 10; ++i)
            {
                result[i] = function(num)
                            {
                                return function()
                                       {
                                           return num;
                                       };
                            }(i);
            }
            
            return result;
        }
    
        var func = createFunctions();

        //every function outputs 10
        for (var i=0; i < func.length; i++)
        {
            document.write(func[i]() + "<br />");
        }

        

    </script>

 </head>
 <body>
  
 </body>
</html>

 

 

 

 

posted @ 2016-07-11 10:13  cutter_point  阅读(109)  评论(0)    收藏  举报