-2

我正在通过《面向 Web 开发人员的专业 JavaScript 第 3 版》这本书学习 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赋给变量factorial

var factorial = f;

所以我认为在下面的例子中直接调用函数 f 是可行的。

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

f(5);

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

4

1 回答 1

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存在于全局范围内。

于 2019-07-03T10:28:49.407 回答