2016-05-19 22 views

Trả lời

9

Điều quan trọng là mọi người hiểu giá trị của hàm trả về hàm; sử dụng kỹ thuật này có thể giúp bạn tiết kiệm mã, hiệu quả JavaScript và hiểu rõ hơn về mức độ mạnh mẽ của JavaScript.
Tôi đã tạo một ví dụ nhanh tôi muốn cho bạn thấy để bạn có thể có được ý tưởng mà tôi đang cố gắng giao tiếp.

Hãy nói rằng bạn có một đối tượng máy chủ với hai đối tượng trẻ em, cả với các phương pháp get, và cả hai thực hiện chính xác cùng một công việc nhưng với một thuộc tính khác nhau:

var accessors = { 
    sortable: { 
     get: function() { 
      return typeof this.getAttribute('sortable') != 'undefined'; 
     } 
    }, 
    droppable: { 
     get: function() { 
      return typeof this.getAttribute('droppable') != 'undefined'; 
     } 
    } 
}; 

Lặp đi lặp lại cùng một mã không phải là lý tưởng, vì vậy chúng tôi có thể tạo một hàm bên ngoài, chuyển cho nó một đối số thuộc tính:

function getAttribute(attr) { 
    return typeof this.getAttribute(attr) != 'undefined'; 
} 

var accessors = { 
    sortable: { 
     get: function() { 
      return getAttribute('sortable'); 
     } 
    }, 
    droppable: { 
     get: function() { 
      return getAttribute('droppable'); 
     } 
    } 
}; 

Điều này tốt hơn nhưng vẫn không lý tưởng vì có thêm một hàm trung gian thực hiện mỗi lần gọi.
Điều gì sẽ làm việc tốt nhất là một hàm trả lại chức năng cuối cùng - đó sẽ loại bỏ chức năng thêm thực hiện với tất cả các cuộc gọi để có được:

function generateGetMethod(attr) { 
    return function() { 
     return typeof this.getAttribute(attr) != 'undefined'; 
    }; 
} 

var accessors = { 
    sortable: { 
     get: generateGetMethod('sortable') 
    }, 
    droppable: { 
     get: generateGetMethod('droppable') 
    } 
}; 

Những gì bạn thấy ở trên là một hàm trả về một chức năng; mỗi phương thức đều có phương thức riêng để nhận thuộc tính và không có phí khi nhận được cuộc gọi.

Đây là một kỹ thuật thực sự hữu ích giúp bạn không bị lặp lại mã tương tự và khi được sử dụng đúng cách, dễ hiểu và dễ bảo trì!

+0

Xin chào, tôi đã quay lại để đọc câu trả lời này một lần nữa và nhận ra rằng tôi vẫn còn bối rối. Điều gì sẽ xảy ra nếu trong v2 của ví dụ mã, bạn chỉ có "get: getAttribute ('sortable')"? nó sẽ không trả lại kết quả tương tự? như "get: generateGetMethod ('sortable')" – Synia

1

Có nhiều trường hợp bạn muốn trả về một hàm. Trong tình huống này đặc biệt nó đề cập đến cách các bộ lọc định nghĩa góc. Hàm bên ngoài có nghĩa là để xử lý bất kỳ phụ thuộc nào có thể cần được tiêm hoặc bất kỳ biến nào có thể cần được chỉ định. Hàm bên trong là bước lọc thực tế được áp dụng trên một bộ sưu tập để trả về một bộ sưu tập nhỏ hơn.

1

Tất cả các ngôn ngữ chức năng và do đó JavaScript cho phép ** Higher order functions *, trong đó các hàm được coi là thành viên lớp đầu tiên của ngôn ngữ và có thể được trả về từ hàm khác hoặc được chuyển làm tham số cho các hàm khác. Điều này cho phép rất nhiều năng lượng trong các ngôn ngữ cho phép những thứ như:

  1. đóng cửa: đóng cửa là loại lại khác nhau của con thú và bổ sung thêm rất nhiều năng lượng để lập trình không đồng bộ qua callbacks. Bạn có thể đọc thêm về đóng cửa ở đây: https://developer.mozilla.org/en/docs/Web/JavaScript/Closures

  2. Abstraction: Khi bạn quay lại một chức năng phơi bày chỉ là một phần nhất định chức năng, bạn luôn có thể ẩn một số phần của nó sử dụng các biến địa phương.Điều này cho phép trừu tượng trong một ngôn ngữ như javascript trong đó bạn không cần phải public, private specifiers truy cập như trong các ngôn ngữ khác như Java hay C#

  3. currying: Bạn có thể thực hiện tách lạng bộ trong javascript bằng chức năng quay trở lại áp dụng trên các thuộc tính chọn . Ví dụ. Xác định tổng hàm để các thông số có thể được áp dụng một phần cho nó. sum(3)(4)

    function sum (a) { 
        return function (b) { 
        return a + b; 
        } 
    } 
    
  4. Factory pattern: Bạn có thể sử dụng chức năng bậc cao để tạo ra các chức năng và sử dụng các chức năng như một nhà máy

Có rất nhiều tính năng khác trong ngôn ngữ JavaScript có thể chỉ vì sự khả năng trả về các hàm.

Các vấn đề liên quan