码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript中的函数表达式及递归

时间:2015-11-10 01:33:31      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:

在JavaScript中,函数是个非常重要的对象,函数通常有三种表现形式:函数声明,函数表达式和函数构造器创建的函数。

本文中主要看看函数表达式及其相关的知识点。

函数表达式

首先,看看函数表达式的表现形式,函数表达式(Function Expression, FE)有下面四个特点:

  • 在代码中须出现在表达式的位置
  • 有可选的函数名称
  • 不会影响变量对象(VO)
  • 在代码执行阶段创建

下面就通过一些例子来看看函数表达式的这四个特点。

特点分析

例子一:在下面代码中,"add"是一个函数对象,"sub"是一个普通JavaScript变量,但是被赋值了一个函数表达式" function (a, b){ return a - b; } ":

function add(a, b){
    return a + b;
}

var sub = function (a, b){
    return a - b;
}

函数递归


这一小节可能有些钻牛角尖,但是这里想演示递归调用可能出现的问题,以及通过命名函数表达式以更安全的方式执行递归。


下面看一个求阶乘的例子,由于函数对象也是可以被改变的,所以可能会出现下面的情况引起错误。


技术分享
function factorial(num){
    if (num <= 1){
        return 1;
    } else {
        return num * factorial(num-1);
    }
} 

console.log(factorial(5))
// 120
newFunc = factorial
factorial = null
console.log(newFunc(5));
// Uncaught TypeError: factorial is not a function(…)
技术分享

这时,可以利用函数的arguments对象的callee属性来解决上面的问题,也就是说在函数中,总是使用"arguments.callee"来递归调用函数。


技术分享
function factorial(num){
    if (num <= 1){
        return 1;
    } else {
        return num * arguments.callee(num-1);
    }
}
技术分享

但是上面的用法也有些问题,当在严格模式的时候"arguments.callee"就不能正常的工作了。


比较好的解决办法就是使用命名函数表达式,这样无论"factorial"怎么改变,都不会影响函数表达式" function f(num){…} "


技术分享

var factorial = (function f(num){
    if (num <= 1){
        return 1;
    } else {
        return num * f(num-1);
    }
});
console.log(add(1, 3)); // 4 console.log(sub(5, 1)); // 4
 

通过这个例子,可以直观的看到函数表达式的前两个特点:

  • 在代码中须出现在表达式的位置
    • function (a, b){ return a - b; } "出现在了JavaScript语句中的表达式位置
  • 有可选的函数名称
    • function (a, b){ return a - b; } "这个函数表达式没有函数名称,是个匿名函数表达式

JavaScript中的函数表达式及递归

标签:

原文地址:http://www.cnblogs.com/jiny123/p/4951706.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!