我在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;
}
};
答案 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.请注意,该文章指出了一些实施错误,但它有点过时了,我认为现代浏览器做得更好。