明白JavaScript内联定名函数---var fun = function f() {}

在运用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

上述代码证实:只管我们能够给内联函数定名,然则这些称号只能在本身函数内部才是可见的。运用内联体式格局挪用,其本质和函数表达式没有太大差别,唯一的区分就是内联定名函数在函数内部供应了一个仅仅可供本身挪用的函数指针,该指针指向函数本身。

    原文作者:吴霸霸
    原文地址: https://segmentfault.com/a/1190000009069211
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞