Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Khác biệt giữa Closure và Nested Function (hàm lồng nhau) trong JavaScript

JavaScript Closures

Trong JavaScript, tất cả các hàm đều hoạt động như closure. Closure là một hàm sử dụng scope nơi nó được khai báo khi được gọi, không phải scope nơi nó được gọi.

Ví dụ Closure

<!DOCTYPE html>
<html>
  <body>
    <h2>JavaScript Closures</h2>
    <script>
      var p = 20;
      function a() {
        var p = 40;
        b(function() {
          alert(p); // 40 - closure nắm scope của a()
        });
      }
      function b(f) {
        var p = 60;
        f();
      }
      a();
    </script>
  </body>
</html>

JavaScript Nested Functions (Hàm lồng nhau)

JavaScript 1.2 cho phép định nghĩa hàm bên trong hàm khác. Tuy nhiên, có hạn chế: định nghĩa hàm không được xuất hiện trong vòng lặp hoặc câu lệnh điều kiện. Hạn chế này chỉ áp dụng cho khai báo hàm với câu lệnh function.

Ví dụ Nested Function

<html>
  <head>
    <script>
      function hypotenuse(a, b) {
        function square(x) { return x * x; }
        return Math.sqrt(square(a) + square(b));
      }
      function secondFunction() {
        var result = hypotenuse(5, 4);
        document.write(result);
      }
    </script>
  </head>
  <body>
    <p>Nhấp nút sau để gọi hàm</p>
    <form>
      <input type="button" onclick="secondFunction()" value="Call Function">
    </form>
  </body>
</html>

Tóm tắt khác biệt

  • Nested Function: Chỉ là hàm được định nghĩa bên trong hàm khác (cấu trúc code).
  • Closure: Là hành vi runtime — hàm con "nhớ" và truy cập được biến của hàm cha ngay cả sau khi hàm cha đã kết thúc thực thi.
  • Mọi closure đều là nested function, nhưng không phải nested function nào cũng tạo closure (nếu không tham chiếu biến ngoài).