JavaScript将命名函数分配给变量

Om3*_*3ga 0 javascript

我在JavaScript: The Good Parts书中读到了以下几种功能.就是这样的.

var Foo = function NameOfFunction() {

};
Run Code Online (Sandbox Code Playgroud)

我根本不懂这个功能.如果有人能够解释这一点并且如何使用它会很棒?

本书的确切代码如下,主要用于递归

var walk_the_DOM = function walk(node, func) {
    func(node);
    node = node.firstChild();
    while (node) {
        walk(node, func);
        node = node.nextSibling;
    }
};
Run Code Online (Sandbox Code Playgroud)

Poi*_*nty 5

当您使用名称实例化一个函数时 - function关键字后面的名称,即 - 该名称将作为对自身的引用绑定函数内部. 函数外部,除非在函数声明语句中创建函数,否则名称不可见.在您的示例中,情况并非如此,因此局部变量"walk_the_DOM"绑定到该函数.

这里的关键优势在于,即使"walk_the_DOM"以某种方式更改其值,所以创建的函数将继续工作(假设对其的引用的副本保存在某处).为什么?因为名称"walk"被绑定在函数内部,并且无论"walk_the_DOM"发生什么,它都将保持绑定.

所以这个陈述有两个部分:

var walk_the_DOM = function walk(node, func) {
    func(node);
    node = node.firstChild;
    while (node) {
        walk(node, func);
        node = node.nextSibling;
    }
};
Run Code Online (Sandbox Code Playgroud)

第一部分是

var walkt_the_DOM ... 
Run Code Online (Sandbox Code Playgroud)

这是一个简单的var声明,它创建了一个在任何方面都不是特别的变量.它的值受初始化表达式的限制:

... = function walk(node, func) {
        func(node);
        node = node.firstChild;
        while (node) {
            walk(node, func);
            node = node.nextSibling;
        }
    };
Run Code Online (Sandbox Code Playgroud)

这恰好是一个函数实例化.

如果函数声明没有名称会发生什么?像这样:

var walk_the_DOM = function(node, func) {
    func(node);
    node = node.firstChild;
    while (node) {
        walk_the_DOM(node, func); // NOTE CHANGE HERE
        node = node.nextSibling;
    }
};
Run Code Online (Sandbox Code Playgroud)

除非由于某种原因"walk_the_DOM"发生变化,否则这样可行:

var thatFunction = walk_the_DOM;

walk_the_DOM = "hello world";

thatFunction(whatever, someFunc); // WILL NOT WORK
Run Code Online (Sandbox Code Playgroud)

我们已经保存了对函数的引用,但由于此版本中的函数希望能够通过外部(函数)变量"walk_the_DOM""找到自己",因此失败,因为"walk_the_DOM"不再引用功能.这是赋予函数自己名称的优势.

这是一篇关于该主题的经典文章.请注意,该文章指出了一些实现错误,但它有点过时,我认为现代浏览器做得更好.