var functionName = function() {} vs function functionName() {}
技术问答
417 人阅读
|
0 人回复
|
2023-09-11
|
最近开始维护别人 JavaScript 代码。我正在修复错误,添加功能,并尝试整理代码,使其更加一致。0 ~7 Y5 I5 B4 f% M0 G
以前的开发人员使用了两种声明函数的方法,我不知道背后是否有原因。' m! k V& K0 S! O
这两种方法是:/ o: h& h8 @& L' i& f4 C
var functionOne = function(){ / / Some code};function functionTwo(){ / / Some code}) [6 K" t; X2 h! V2 G$ |
使用这两种不同方法的原因是什么,每种方法的优缺点是什么?有什么可以用一种方法完成,而另一种方法不能完成吗?
7 i6 i! H- m: n$ { / l, ]. t8 `% i8 t; r' o1 i
解决方案: . w3 w) H- Q1 ^; I, l
区别在于它functionOne它是一种函数表达式,所以它只在到达银行时定义,functionTwo它是一个函数声明,并在其周围的函数或脚本执行后立即定义(因为hoisting)。3 |1 c) i: {# w4 F' \2 t# N
例如,函数表达式:
. J. C% Z% b% T @' C" s$ c% U// TypeError: functionOne is not a functionfunctionOne();var functionOne = function() { console.log("Hello!");};! C* r B* T- O6 X
而且,函数声明:
7 V/ E+ e% s4 ~8 [" T7 b// Outputs: "Hello!"functionTwo();function functionTwo() { console.log("Hello!");}/ E# V/ v0 s+ Q
从历史上看,在浏览器之间处理块中定义的函数是不一致的。严格模式( ES5 中引入)通过将函数声明范围限定到它们的封闭块来解决这个问题。
: `; v8 z+ F/ G'use strict note this block! function functionThree() console.log("Hello!"); }}functionThree(); // ReferenceError5 W, u( }* f2 B$ n
|
|
|
|
|
|