JavaScript函数,递归

函数表达式

1、JavaScript中定义函数有3种方法:

1.使用function语句,

function fn(){

  alert("这是使用function语句进行函数定义");

}

fn();

2.使用Function()构造函数克隆函数

var F = new Function("a","b","alert(a+b)");

F(a,b);

其实相当于如下代码:

function F(a,b){

  alert(a+b);

}

3.使用函数直接量*/

var zhenn = function(){

  alert("zhenn");

}

zhenn();

  另附a函数声明:
 代码如下:

function funcName(arg1,arg2,arg3){
  //函数体
}
 a.name属性:可读取函数名。非标准,浏览器支持:FF、Chrome、safari、Opera。

     b.函数声明提升:指执行代码之前会先读取函数声明。即函数调用可置于函数声明之前。

  b.函数表达式:
代码如下:
var funcName = function(arg1,arg2,arg3){
  //函数体
};
    a.匿名函数:function关键字后无标识符,name属性值为空字符串。在把函数当成值使用时,都可用匿名函数。
    b.类似其他表达式,函数表达式使用前需先赋值,故不存在"函数声明提升"那样的作用。

代码如下:

if判断中的重复函数声明
if(condition){
    function sayHi(){
        alert("Hi!");
    }
} else {
    function sayHi(){
        alert("Yo!");
    }
}
      浏览器JavaScript引擎修正错误差异:大多浏览器会返回第二个声明,忽略condition;FF则会在condition为true时返回第一个声明。
      使用函数表达式可解决并实现:
代码如下:

if判断 函数表达式
var sayHi;
if(condition){
    sayHi = function(){
        alert("Hi!");
    }
} else {
    sayHi = function(){
        alert("Yo!");
    }

}


2、递归

那么什么叫递归呢?递归函数,是在一个函数中通过名字调用自身的情况下构成的。所谓递归函数就是在函数体内调用本函数。最简单的例子就是计算阶乘。0和1的阶乘都会被定义为1,更大的数的阶乘是通过计算1*1*...来求得的,每次增加1,直至达到要计算阶乘的那个数。

 代码如下:

function fun(){    
// 自己调用自己,称为递归调用    
fun();    
console.log("m2");}fun();


function factorial(num){   //一个经典的递归阶乘函数
    if (num <= 1){
        return 1;
    } else {
        return num * factorial(num-1);
    }
}

     a.若使用下列代码调用该函数,会出错:
代码如下:

var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4));

      将factorial()函数保存到变量anotherFactorial中后,将factorial变量设为null后不再引用函数,而anotherFactorial(4)中要执行factorial()函数,故出错。
      使用argument.callee(指向正在执行的函数的指针)可解决:

 代码如下:

解决方案

function factorial(num){
    if (num <= 1){
        return 1;
    } else {
        return num * arguments.callee(num-1);
    }
}
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4));  //24
    在非严格模式,使用递归函数时,用argument.callee代替函数名更保险
    在严格模式下,使用argument.callee会出错,可用函数表达式 代替 函数声明:
 代码如下:

函数表达式代替函数声明
var factorial = function f(num){
    if (num <= 1){
        return 1;
    } else {
        return num * f(num-1);
    }
}

当然递归也有自己的缺点:如果递归函数的终止条件不明确或者缺少终止条件会导致函数长时间运行,是用户界面处于假死状态。值得注意的是:浏览器对递归的支持熟练与JS调用栈大小直接相关,当使用太多递归甚至超过最大调用栈容量时,浏览器会报错误信息,不过各个浏览器对报错的提示信息也不一样。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值