Đ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ì!
Nguồn
2016-05-20 06:07:30
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