我正在通过“ 面向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不是函数”; 为什么?闭包有什么关系吗?
答案 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
存在于全局范围内。