将初始函数(函数声明)分配给变量时,为什么不能调用初始函数?

时间:2019-07-03 10:17:50

标签: javascript recursion function-expression

我正在通过“ 面向Web开发人员的专业JavaScript第三版”一书学习JavaScript。在第7章的7.1节中,作者举了一个示例来实现执行函数和函数名之间的解耦:

var factorial = (function f(num) {
    if (num <= 1) {
        return 1;
    } else {
        return num * f(num - 1);
    }
});

无论在严格模式下,上面的代码都能很好地工作。 正如我之前看到的,代码分两个步骤工作:

首先:声明函数f

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

第二:将函数名称f分配给变量阶乘

var factorial = f;

因此,我认为在下面的示例中直接调用函数f是可行的。

var factorial = (function f(num) {
    if (num <= 1) {
        return 1;
    } else {
        return num * f(num - 1);
    }
});

f(5);

但是实际上,它不起作用。控制台说“ f不是函数”; 为什么?闭包有什么关系吗?

1 个答案:

答案 0 :(得分:1)

var factorial = function f(){};function f(){} var factorial = f;

不同

使用函数表达式时,只能使用在函数内部输入的名称来访问函数。

var factorial = function f(num) {
    if (num <= 1) {
        return 1;
    } else {
        return num * f(num - 1);
    }
};
console.log(typeof f);
console.log(factorial(5));

如果您先定义函数,然后将其分配给变量,则作用域中的每个人都可以使用两个名称来访问该函数。

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

var factorial = f;
console.log(typeof f);
console.log(factorial(5));

在第一个示例中,f不会被吊起。名称f仅存在于函数内部。在第二个示例中,f被吊起。名称f存在于全局范围内。