var functionName = function() {} vs function functionName() {}
技术问答
418 人阅读
|
0 人回复
|
2023-09-11
|
最近开始维护别人 JavaScript 代码。我正在修复错误,添加功能,并尝试整理代码,使其更加一致。
, D% b. Q/ [! `6 e |; R+ W9 V8 Y: H以前的开发人员使用了两种声明函数的方法,我不知道背后是否有原因。
" P/ N6 O, A- v0 _# t8 i0 Q这两种方法是:( I9 e7 Z3 D: v5 z% Z
var functionOne = function(){ / / Some code};function functionTwo(){ / / Some code}& g' j) m" r& S# Y
使用这两种不同方法的原因是什么,每种方法的优缺点是什么?有什么可以用一种方法完成,而另一种方法不能完成吗?
9 m3 e4 t0 ?" P 6 g- F8 @2 }; f& c+ v! H( T
解决方案: & d5 G$ Z* j, ^4 F* q; l
区别在于它functionOne它是一种函数表达式,所以它只在到达银行时定义,functionTwo它是一个函数声明,并在其周围的函数或脚本执行后立即定义(因为hoisting)。
* J8 ?1 j; Z" w例如,函数表达式:- x6 h1 O% ~0 M2 x
// TypeError: functionOne is not a functionfunctionOne();var functionOne = function() { console.log("Hello!");};
* f. O, i/ Q( M" {/ z* `/ r! c 而且,函数声明:- x* h* @. W9 c+ }) s
// Outputs: "Hello!"functionTwo();function functionTwo() { console.log("Hello!");}
6 r+ w% F2 E) A 从历史上看,在浏览器之间处理块中定义的函数是不一致的。严格模式( ES5 中引入)通过将函数声明范围限定到它们的封闭块来解决这个问题。8 w5 }* d0 p1 j
'use strict note this block! function functionThree() console.log("Hello!"); }}functionThree(); // ReferenceError
" X j1 W+ o" E2 ]$ w6 V |
|
|
|
|
|