为什么使用JavaScript函数声明(和表达式)
Why JavaScript function declaration (and expression)?
我见过其他人使用以下模式。
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 》
- 函数声明与函数表达式之间的性能差异
- 从性能的角度来看,函数声明与表达式
- 全局范围内的函数表达式与函数声明的区别
- JSHINT 严格违反函数表达式与函数声明
- 这是一个功能声明、表达式和对象吗?
- 尝试使用正则表达式匹配代码中的函数声明
- 正则表达式在字面声明时有效,但在使用新运算符和变量值声明时无效
- JavaScript 语言解析:区分函数表达式和声明
- 在声明函数中使用“this”时严格违规,函数表达式不违规
- 使用正则表达式传递语法有效的c++声明/初始化
- 循环中javascript中函数声明与函数表达式的性能
- 为什么使用JavaScript函数声明(和表达式)
- Javascript - 如果语句同时检查表达式和定义声明?这是令人困惑的
- 需要解释函数表达式如何在函数声明中作为参数传递
- 使用立即调用的函数表达式时,JavaScript提升声明混淆
- Node.js REPL在函数声明或函数表达式后自动声明下划线
- 使用函数表达式而不是函数声明有哪些好情况
- Javascript私有方法:函数表达式与函数声明
- 函数声明和函数表达式
- 在表达式中使用未声明、未初始化的变量:该怎么想?