zoukankan      html  css  js  c++  java
  • JavaScript中的递归函数问题

    学过其它编程语言的都应该会知道递归这个问题,递归函数是在一个函数通过名字调用自身的情况下后构成的。

    function fac(num){
    		if(num<=1){
    			return 1;
    		}else{
    			return num*fac(num-1);
    		}
    	}

    这是一个比較经典的阶乘算法。这个写法就实现我们所说的递归。这个代码看起来是没有什么问题, 在c或者其它编程语言都有这种描写叙述。可是在JavaScript中有时就会出错。

    就比方:

    <span style="white-space:pre">	</span>var myfac=fac;
    	fac=null;
    	console.log(myfac(4));//出错了
    
    

    为什么会出错呢?
    依照道理fac把原始函数引用给了myfac,然后将fac置为空,指向原始函数的引用依旧在myfac中,应该能够訪问到才对啊。这个就出现故障了,在调用myfac的时候,因为必须运行fac()。而此时fac已经不再是一个函数了,所以才会导致错误,在这种情况下使用arguments.callee(指向正在运行的函数)能够解决问题。

    function fac(num){
    		if(num<=1){
    			return 1;
    		}else{
    			return num*arguments.callee(num-1);
    		}
    	}

    通过使用arguments.callee取代函数名,能够确保不管怎么调用函数都不会出问题。所以,在编写递归函数时。使用arguments.calllee()总比使用函数名要保险得多。

    但在严格模式下,是不能够通过脚本訪问arguments.callee的,訪问这个属性会导致错误,只是能够使用命名函数表达式来达到同样的效果。

    var fac=(function f(num){
    		if(num<=1){
    			return 1;
    
    		}else{
    			return num*f(num-1)
    		}
    	});
    完辣。。。



  • 相关阅读:
    switch statement
    Block statement
    Variable hoisting Global variables Constants
    How the Web works
    Discover browser developer tools
    Publishing via GitHub
    第十二节,OpenCV学习(一)图像的读取、显示、保存
    剑指Offer编程题3——从尾到头打印链表
    剑指Offer编程题2——替换空格
    剑指Offer编程题1——二维数组中的查找
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8835726.html
Copyright © 2011-2022 走看看