解释`foo()` {} 和 `var foo = function() {}`这两种方式在使用foo时的区别。


在 JavaScript 中,我们有不同的方法来定义函数。`function foo() {}` 和 `var foo = function() {}` 是定义函数的两种不同方式。这两种方式各有优缺点和不同的使用场景;但是,在执行函数时,两者都会产生相同的结果。

因此,本教程将讲解定义函数这两种方式之间的区别。

函数声明 `function foo() {}` 的解释

`function foo() {}` 是在 JavaScript 中声明函数的常规方法,每个初学者和开发者都会使用它。我们也可以称之为命名函数。

当程序执行控制到达声明函数的作用域时,JavaScript 会评估函数声明。函数声明的评估不是逐步过程的一部分,而是在开始时进行评估。

此外,函数声明会被提升到声明它的特定作用域中所有代码的顶部。因此,我们可以在作用域中的任何位置调用函数,甚至在声明之前。

语法

用户可以按照以下语法声明函数。

function foo(parameters, .... ) {
   // function body
}

在上面的语法中,“function”是表示函数声明的关键字,foo 是函数名。

示例

在这个例子中,我们通过函数声明定义了函数 foo()。之后,我们像调用普通函数一样调用它。

<html>
   <body>
      <h2>function foo() { } (function declaration)</h2>
      <div id="output"></div>
      <script>
         let output = document.getElementById("output");
         
         // declaring the function
         function foo() {
            output.innerHTML += "The function foo is invoked!";
         }
         foo();
      </script>
   </body>
</html>

示例

在下面的示例中,我们使用参数定义了函数。我们将 invokedPosition 作为第二个参数传递,表示我们在哪里调用了函数。

我们在声明之前调用了 foo() 函数,因为当执行流程进入作用域时,JavaScript 会在开始时评估函数,并将其提升到顶部。

<html>
   <body>
      <h2>function foo() { } (function declaration)</h2>
      <div id="output"></div>
      <script>
         let output = document.getElementById("output");
         
         // As foo is hoisted on top, we can call the function before the declaration
         foo(10, "Top");
         
         // declaring the function with parameters
         function foo(param1, inovkingPosition) {
            output.innerHTML += "The function foo is invoked from " + inovkingPosition + "</br>";
            output.innerHTML += "The value of the param1 is " + param1 + " <br/> <br/>";
         }
         foo(20, "bottom");
      </script>
   </body>
</html>

函数表达式 `var foo = function() {}` 的解释

`var foo = function() {}` 与定义函数相同,称为函数表达式。这里,`function() {}` 是一个函数表达式,我们将其存储在 foo 变量中。foo 是一个普通的变量,就像其他变量一样,我们甚至可以将数字和字符串存储在 foo 变量中。

JavaScript 不会像函数声明那样在开始时评估函数表达式。它会逐步评估函数表达式。当执行流程到达函数表达式时,JavaScript 会评估表达式并将结果存储在 foo 变量中。

此外,函数表达式不会被提升到代码的顶部,因此我们不能像函数声明那样在定义函数表达式之前调用它。

语法

用户可以按照以下语法使用函数表达式定义函数。

var foo = function (params) {
   
   // function body
};

在上面的语法中,函数是匿名定义的,所以我们可以称之为匿名函数。我们可以使用 foo 变量作为函数的标识符。

示例

在这个例子中,我们使用函数表达式定义了函数,并将其存储在 foo 标识符中。之后,我们使用 foo 标识符调用存储在其中的函数表达式,并且我们也向 foo 标识符传递了参数。

<html>
   <body>
      <h2>var foo = function() { } (function expression)</h2>
      <div id="output"></div>
      <script>
         let output = document.getElementById("output");
         
         // defining the function expression and storing it in the foo variable
         var foo = function (param) {
            output.innerHTML += "Inside the function expression. </br>";
            output.innerHTML += "The value of the param is " + param + "</br>";
         };
         
         // calling the function expression via foo identifier
         foo("Hi Users!");
      </script>
   </body>
</html>

函数表达式有不同的用例。用户可以使用它作为回调函数来编写简短的函数语法。此外,用户可以将其用作闭包函数。有时,我们需要将函数作为参数传递,然后我们可以使用函数表达式。

示例

在这个例子中,我们将函数表达式作为 `sort()` 方法的参数传递。用户可以看到,我们传递的是匿名函数作为参数,而不是写一个带名称的声明。

<html>
   <body>
      <h2>Passing function expression as an argument</h2>
      <div id="output"></div>
      <script>
         let output = document.getElementById("output");
         let number = [320, 45, 3, 23, 54];
      
         // passing the function expression as an argument of the sort() method
         number.sort(function (element1, element2) {
            return element2 - element1;
         });
         output.innerHTML += "The sorted array is " + number;
      </script>
   </body>
</html>

`function foo() {}` 和 `var foo = function() {}` 的区别

下表突出显示了 `function foo() {}` 和 `var foo = function() {}` 之间的区别。

`function foo() {}`

`var foo = function() {}`

这是一个函数声明。

这是一个函数表达式。

它被提升到作用域的顶部。

它不会被提升到作用域中。

JavaScript 在作用域执行开始时对其进行评估。

JavaScript 逐步执行代码时对其进行评估。

我们可以使用函数名称来识别它。

我们可以使用存储它的标识符来识别它。

它用于定义普通函数。

当我们需要将函数作为参数传递或需要使用函数作为闭包时,可以使用它。

结论

在 JavaScript 中,有两种定义函数的方式:**函数声明** 和 **函数表达式**。函数声明使用 `function` 关键字定义,后跟函数名,通常写成 `function foo() {}`。JavaScript 在程序执行到达声明它们的范围时评估函数声明,并将它们提升到该范围的代码顶部。这意味着可以在声明它们之前调用它们。

函数表达式使用变量定义,通常写成 `var foo = function() {}`。函数表达式不会被提升,必须在调用之前定义。函数声明和函数表达式可以执行相同的任务,但它们的语法和评估行为不同。

更新于:2023年1月5日

1K+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告