gpt4 book ai didi

javascript - "bar"中 "var foo = function bar (){ ... }"的用途是什么?

转载 作者:数据小太阳 更新时间:2023-10-29 06:11:00 26 4
gpt4 key购买 nike

在 Douglas Crockford 的书中,他将递归函数写为:

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

我从未见过定义为 var foo = function bar(){...} 的函数 - 我总是看到声明的右侧是匿名的: var foo = function (){...}

声明右侧的名称walk的唯一目的是缩短walk_the_DOM的调用吗?它们似乎成为相同功能的不同名称。也许我误解了这段代码的工作原理。

在变量声明和函数构造中命名函数是否有功能原因?

最佳答案

Is there a functional reason for naming the function both in the variable declaration and the function construct?

是的。 function bar() {} 导致函数的 name 属性设置为 bar,这对于调试堆栈跟踪等很有用.

关于您提到的一些命名困惑,这可能会有所帮助:

function bar() {}

^ 这是一个函数声明,因为它不作为赋值表达式的一部分存在。

var foo = function() {};

^ 这是一个赋值表达式,其中右边的操作数是一个函数表达式,函数表达式定义了一个匿名函数 .

var foo = function bar() {};

^ 这是一个赋值表达式,其中右边的操作数是一个函数表达式,函数表达式定义了一个命名函数 .

可能值得注意的是,函数声明 可以通过函数名称在本地引用,因此以下语句大致 是等效的:

function bar() {}

var bar = function() {};

我说大致 等效,因为第二个语句仍然生成一个匿名 函数,而不是一个命名 函数。函数声明的提升方式也有细微差别。例如,考虑以下内容:

function test() {
hello();

var hello = function () { console.log('hello'); };
}

test();
// > TypeError: hello is not a function

请注意,hello 是在我们尝试调用它的地方从技术上定义的(唯一的异常(exception)是它还不是函数)。这是由于可变提升。不过,正如预期的那样,我们还没有分配我们的函数给hello 变量。这真的比解释更容易展示。基本上,由于提升,上面的 test 示例等同于:

function test() {
var hello; // declared, but not assigned yet

hello();

hello = function () { console.log('hello'); }; // now the assignment happens
}

将其与实际的函数声明进行比较:

function test() {
hello();

function hello() { console.log('hello'); };
}

test();
// > "hello"

请注意,即使声明位于调用命令下方,它仍然有效,因为函数声明作为一个整体被提升到其作用域的顶部(在本例中,test)。

如果这令人困惑,这里有一个更简洁的行为描述可能会有所帮助:声明被提升,而不是赋值。只要您了解函数声明和函数表达式之间的区别,就可以了。 :)

关于javascript - "bar"中 "var foo = function bar (){ ... }"的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31572252/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com