JavaScript中的函数表达式及递归
2015-11-10 00:12
405 查看
在JavaScript中,函数是个非常重要的对象,函数通常有三种表现形式:函数声明,函数表达式和函数构造器创建的函数。
本文中主要看看函数表达式及其相关的知识点。
在代码中须出现在表达式的位置
有可选的函数名称
不会影响变量对象(VO)
在代码执行阶段创建
下面就通过一些例子来看看函数表达式的这四个特点。
这一小节可能有些钻牛角尖,但是这里想演示递归调用可能出现的问题,以及通过命名函数表达式以更安全的方式执行递归。
下面看一个求阶乘的例子,由于函数对象也是可以被改变的,所以可能会出现下面的情况引起错误。
这时,可以利用函数的arguments对象的callee属性来解决上面的问题,也就是说在函数中,总是使用"arguments.callee"来递归调用函数。
但是上面的用法也有些问题,当在严格模式的时候"arguments.callee"就不能正常的工作了。
比较好的解决办法就是使用命名函数表达式,这样无论"factorial"怎么改变,都不会影响函数表达式" function f(num){…} "
通过这个例子,可以直观的看到函数表达式的前两个特点:
在代码中须出现在表达式的位置
" function (a, b){ return a - b; } "出现在了JavaScript语句中的表达式位置
有可选的函数名称
" function (a, b){ return a - b; } "这个函数表达式没有函数名称,是个匿名函数表达式
本文中主要看看函数表达式及其相关的知识点。
函数表达式
首先,看看函数表达式的表现形式,函数表达式(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; } "这个函数表达式没有函数名称,是个匿名函数表达式
相关文章推荐
- js中点和向量的基本方法
- javascript适合移动端的日期时间拾取器
- 浅谈javascript中replace()方法
- JavaScript编程的单例设计模讲解
- javascript密码验证
- javascript实现五星评分功能
- JavaScript函数的一些注意要点小结及js匿名函数
- 详解javascript函数的参数
- js密码强度校验
- 简单学习JavaScript中的for语句循环结构
- JavaScript中利用各种循环进行遍历的方式总结
- 每天一篇javascript学习小结(基础知识)
- 浅谈使用MVC模式进行JavaScript程序开发
- JavaScript中SetInterval与setTimeout的用法详解
- 纯javascript响应式树形菜单效果
- JS截取与分割字符串常用技巧总结
- js图片轮播手动切换效果
- extjs6入门:用sencha cmd搭建简单的extjs6项目
- JS闭包
- 【JavaScript知识点九】 javascript window对象