为什么使用JavaScript函数声明(和表达式)

Why JavaScript function declaration (and expression)?

本文关键字:表达式 声明 函数 JavaScript 为什么      更新时间:2023-09-26

我见过其他人使用以下模式。

var bar = function foo(){};
console.log(bar); // foo()
console.log(foo); // ReferenceError: foo is not defined

但为什么呢?如果两者都声明了,我就明白了,但事实并非如此。原因是什么?

正如其他人所提到的,在示例中使用第一种形式(命名函数表达式)可以帮助调试,尽管随着浏览器中内置开发工具的最新改进,这一论点变得不那么有说服力了。使用命名函数表达式的另一个原因是,您可以将函数名称用作函数体中的变量,而不是ES5 arguments.callee中现在不推荐使用的变量。

然而,命名函数表达式在InternetExplorer<9,并且当您针对这些浏览器时通常应该避免。有关更多信息,请参阅Juriy Zaytsev关于该主题的精彩文章。

在调试应用程序时,当使用"命名"匿名函数时,更容易知道调用堆栈中的调用内容。因此,这是一种为匿名函数命名以进行调试的方法。

试试这个,看看调试器中的调用堆栈:

myDiv = document.getElementById("myDiv");
myDiv.onclick = function OnClick(){
    debugger;
    //do something
}

他们命名一个匿名函数是因为它使调试更容易。调试时,您将在调用堆栈中看到对"foo"的调用,而不是对"匿名"的一堆调用。

我能想到的唯一原因是给函数一个所需的名称。这有助于调试,因为检查器使用函数对象的name属性。试试这个:

var bar = function foo(){};
console.log(bar.name); // foo

如果您在foo中放入一些真实的代码,并在浏览器中的JavaScript调试器中添加一个断点,您将在调用堆栈中看到函数foo

函数定义(或文字)由4部分组成。1.保留字CCD_ 4。一个可选名称,调试器或函数可以使用它来递归调用自己。3.参数和4。{ } 封装的函数体

函数范围之外的foo不存在。但是,由于您将函数分配给了变量栏,您可以使用方法调用栏来调用它,并且由于栏已定义,您可以打印它

如果你对JavaScript感兴趣,你真的应该考虑一下Douglas Crockford的书《JavaScript:The Good Parts 》