JavaScript将命名函数分配给变量

时间:2014-01-25 16:10:24

标签: javascript

我在JavaScript: The Good Parts书中读到了以下类型的功能。就是这样。

var Foo = function NameOfFunction() {

};

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

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

var walk_the_DOM = function walk(node, func) {
    func(node);
    node = node.firstChild();
    while (node) {
        walk(node, func);
        node = node.nextSibling;
    }
};

1 个答案:

答案 0 :(得分: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;
    }
};

第一部分是

var walkt_the_DOM ... 

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

... = function walk(node, func) {
        func(node);
        node = node.firstChild;
        while (node) {
            walk(node, func);
            node = node.nextSibling;
        }
    };

恰好是一个函数实例化。

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

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;
    }
};

除非由于某种原因“walk_the_DOM”发生变化,否则会有效:

var thatFunction = walk_the_DOM;

walk_the_DOM = "hello world";

thatFunction(whatever, someFunc); // WILL NOT WORK

我们保存了对该函数的引用,但由于此版本中的函数希望能够通过外部(函数)变量“walk_the_DOM”“找到自己”,因此失败,因为“walk_the_DOM”没有更长的是指功能。这是赋予函数自己名称的优势。

Here is a classic article on the topic.请注意,该文章指出了一些实施错误,但它有点过时了,我认为现代浏览器做得更好。