JavaScript将命名函数赋值给变量

JavaScript将命名函数赋值给变量,javascript,Javascript,我在JavaScript中读到了以下函数:好的部分。是这样的 var Foo = function NameOfFunction() { }; 我完全不理解这个函数。如果有人能概括地解释这一点,以及如何使用这一点,那就太好了 下面是这本书中的确切代码,它基本上用于递归 var walk_the_DOM = function walk(node, func) { func(node); node = node.firstChild(); while (node) {

我在
JavaScript中读到了以下函数:好的部分。是这样的

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

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

这里的关键优势是,即使“walk_The_DOM”以某种方式更改其值,这样创建的函数仍将继续工作(假设引用的副本保存在某个位置)。为什么?因为名称“walk”在函数中是绑定的,并且无论“walk\u the\u 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;
    }
};
这是可行的,除非出于某种原因“在DOM中行走”有所改变:

我们保存了对函数的引用,但由于此版本中的函数希望能够通过外部(函数)变量“walk_the_DOM”找到自己,因此失败了,因为“walk_the_DOM”不再引用该函数。这就是给函数取自己名字的好处


请注意,那篇文章指出了一些实现错误,但有些过时,我认为现代浏览器做得更好。

FYI,
node.firstChild()
不应该在末尾有
()
。可能是Thank you@pointy的重复。请你再举一个简单的编码例子来详细说明你的答案好吗?感谢you@2619好的,答案已经扩展了。
var thatFunction = walk_the_DOM;

walk_the_DOM = "hello world";

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