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