定义函数的方式有两种, 一种是函数声明, 一种就是函数表达式了
函数声明最常见了,
- sayHi();
- // 函数声明会发生提升
- function sayHi () {
- alert('Hi')
- }
函数表达式
- var functionName = function (arg0, arg1, arg2) {
- // 函数体
- };
创建一个函数然后赋值给变量, 这种情况下创建的函数叫匿名函数, 因为 function 关键字后面没有标识符, 匿名函数的 name 是空字符串
函数表达式与其他表达式不一样, 使用前必须先赋值, 不会发生函数提升
用处:
(1) 递归
- function factorial (num) {
- if (num <= 1) {
- return 1;
- } else {
- return num*factorial(num-1);
- }
- }
这是一个经典的阶乘函数, 下面代码会导致函数出错
- var anotherFactorial = factorial;
- factorial = null;
- alert(anotherFactorial(4)); // 出错!
原因, 这里把函数赋值给另一个变量 (指针), 同时将原函数指针赋值为空, 但是在调用的时候, 仍然会调用到 factorial(), 但其已经不存在了, 就会出错
我们之前是用 arguments.callee 解决这个问题, arguments 对象的 callee 指针能指向拥有该 arguments 对象的函数.
故:
- function factorial (num) {
- if (num <= 1) {
- return 1;
- } else {
- return num*arguments.callee(num-1);
- }
- }
但是在严格模式下, 不能通过脚本访问 arguments.callee , 访问这个属性会导致错误, 不过我们可以用命名函数表达式达到相同的效果
即:
- var factorial = (function func (num) {
- if (num <= 1) {
- return 1;
- } else {
- return num*func(num-1);
- }
- });
来源: http://www.bubuko.com/infodetail-2790106.html