我在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)
当您使用名称实例化一个函数时 - 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"不再引用功能.这是赋予函数自己名称的优势.
这是一篇关于该主题的经典文章.请注意,该文章指出了一些实现错误,但它有点过时,我认为现代浏览器做得更好.