回答

收藏

var functionName = function() {} vs function functionName() {}

技术问答 技术问答 309 人阅读 | 0 人回复 | 2023-09-11

最近开始维护别人 JavaScript 代码。我正在修复错误,添加功能,并尝试整理代码,使其更加一致。
. @0 P* p6 {( o- ]8 }) n  X以前的开发人员使用了两种声明函数的方法,我不知道背后是否有原因。
8 T4 l  g' J9 |1 q( |这两种方法是:% @3 J8 l2 X" M: U6 p* o/ K. f
    var functionOne = function(){     / / Some code};function functionTwo(){     / / Some code}
    ! }/ _" ~8 J0 v- `7 B+ H: c  A
使用这两种不同方法的原因是什么,每种方法的优缺点是什么?有什么可以用一种方法完成,而另一种方法不能完成吗?
5 {; }; t2 I2 e* M: x: t5 W+ c                                                                . S0 W, u- L8 G5 ?0 x# m
    解决方案:                                                                / q% |6 V# s# ~4 d! y# h
                                                                区别在于它functionOne它是一种函数表达式,所以它只在到达银行时定义,functionTwo它是一个函数声明,并在其周围的函数或脚本执行后立即定义(因为hoisting)。4 A) C1 a  h4 v* }4 \# K, s
例如,函数表达式:
2 ^( b! Q# P7 L3 K( [& a
    // TypeError: functionOne is not a functionfunctionOne();var functionOne = function() {  console.log("Hello!");};0 K* e; s: h. \1 Z: w, j
而且,函数声明:. M9 g$ l" t/ _
    // Outputs: "Hello!"functionTwo();function functionTwo() {  console.log("Hello!");}
    4 Q3 X: g/ X5 j4 t# M9 q
从历史上看,在浏览器之间处理块中定义的函数是不一致的。严格模式( ES5 中引入)通过将函数声明范围限定到它们的封闭块来解决这个问题。$ M) d% D5 ], N) F* @3 x9 |5 [
    'use strict note this block!  function functionThree()      console.log("Hello!");  }}functionThree(); // ReferenceError; ~" X" B( `9 l/ O
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则