在运用JavaScript递归挪用时,我们每每会在函数内部挪用函数本身(经由过程函数名),然则当我们转变了定义时所用函数名的指向时,那末这个递归函数指针关联的递归函数也将随之失效。
var factorial = function (num) {
if (num <= 1) {
return 1;
} else {
return num * factorial(num - 1);
}
};
console.log(factorial(5)); // 120;
var anothorFactorial = factorial;
factorial = null;
console.log(anothorFactorial(5)); // Uncaught TypeError: factorial is not a function
在非严厉形式下我们能够运用 num * arguments.callee(num – 1)来替代函数名。
严厉形式下,通常会采纳内联定名函数来处理这个题目。
var factorial = (function f(num) {
if (num <= 1) {
return 1;
} else {
return num*f(num - 1);
}
});
console.log(factorial(5)); // 120
var anothorFactorial = factorial;
factorial = null;
console.log(anothorFactorial(5)); // 120
这类体式格局的函数挪用区分于下面这类体式格局:
function f(num) {
if (num <= 1) {
return 1;
} else {
return num*f(num - 1);
}
};
var factorial = f;
var anothorFactorial = factorial;
factorial = null;
console.log(anothorFactorial(5)); // 120
f = null;
console.log(anothorFactorial(5)); // Uncaught TypeError: f is not a function
给函数表达式的匿名函数定名并不会转变表达式的性子,即不会让它变成一个函数声明
var factorial = function f() {
console.log(factorial == f); // true
}
factorial(); //true
console.log(typeof f); // undefined
f(); // Uncaught ReferenceError: f is not defined
上述代码证实:只管我们能够给内联函数定名,然则这些称号只能在本身函数内部才是可见的。运用内联体式格局挪用,其本质和函数表达式没有太大差别,唯一的区分就是内联定名函数在函数内部供应了一个仅仅可供本身挪用的函数指针,该指针指向函数本身。