我最近开始维护别人的 JavaScript 代码。我正在修复错误、添加功能并尝试整理代码并使其更加一致。
以前的开发人员使用了两种声明函数的方式,我无法弄清楚它背后是否有原因。
这两种方式是:
var functionOne = function() { // Some code }; function functionTwo() { // Some code }
使用这两种不同方法的原因是什么,每种方法的优缺点是什么?有什么可以用一种方法完成而另一种方法无法完成的吗?
不同之处在于它functionOne是一个函数表达式,因此仅在到达该行时才定义,而functionTwo是一个函数声明,并在其周围的函数或脚本执行后立即定义(由于hoisting)。
functionOne
functionTwo
例如,一个函数表达式:
// TypeError: functionOne is not a function functionOne(); var functionOne = function() { console.log("Hello!"); };
并且,一个函数声明:
// Outputs: "Hello!" functionTwo(); function functionTwo() { console.log("Hello!"); }
从历史上看,块内定义的函数声明在浏览器之间的处理不一致。严格模式(在 ES5 中引入)通过将函数声明范围限定到它们的封闭块来解决这个问题。
'use strict'; { // note this block! function functionThree() { console.log("Hello!"); } } functionThree(); // ReferenceError