2017-08-12 25 views
5

Tôi đang xem xét nguồn Phản ứng và tình cờ gặp một yêu cầu với var emptyFunction = require('fbjs/lib/emptyFunction');.Mục đích của hàm makeEmptyFunction trong fbjs là gì?

Tôi đã xem xét chức năng này và đã bị nhầm lẫn bởi những gì nó làm.

Dưới đây là chức năng

function makeEmptyFunction<T>(arg: T): (...args: Array<any>) => T { 
    return function() { 
    return arg; 
    }; 
} 

const emptyFunction: (...args: Array<any>) => void = function() {}; 

Trong những ý kiến, họ đưa ra những lời giải thích sau đây mà tôi đã nhầm lẫn bởi:

Chức năng này chấp nhận và loại bỏ nguyên liệu đầu vào; Nó không có tác dụng phụ. Đây là chủ yếu hữu ích idiomatically cho chức năng overridable điểm cuối mà luôn luôn cần phải được callable, vì JS thiếu một null-gọi ngữ ala Cocoa

Tôi chưa bao giờ đi qua rỗng kêu gọi thành ngữ và đã hy vọng ai đó có thể làm rõ ý nghĩa của điều này và giải thích mục đích của chức năng này bằng ngôn ngữ ít kỹ thuật.

Hy vọng câu hỏi này sẽ không bị xem thường vì nó không liên quan đến mã chính xác. Có lẽ nó thuộc về nơi khác, nếu vậy tôi xin lỗi.

Trả lời

4

Khi lập trình bằng JavaScript, chúng tôi có thể lấy hàm làm tham số cho một hoạt động nhất định. Ví dụ, một hàm có thể có một cuộc gọi lại được gọi sau một số loại sự kiện.

function doIt(callback) { 
    // some work 
    callback(); 
    // more work 
} 

Bây giờ nếu callback đây là một tham số tùy chọn và nó không được cung cấp, chúng tôi sẽ nhận được Uncaught TypeError: callback is not a function lỗi vì gọi lại là không xác định. Có hai giải pháp cho vấn đề này. Điều hiển nhiên là kiểm tra callback với tuyên bố if. Một tùy chọn khác là đặt một hàm trống làm giá trị mặc định là callback nếu nó không được gán. Cách tiếp cận này rất hữu ích và tỏa sáng nếu chúng ta có nhiều nơi gọi hàm callback. Vì vậy, chúng tôi không cần phải kiểm tra nó cho undefined mỗi lần trước khi gọi nó.

function doIt(callback) { 
    callback = callback || function(){}; 
    // some work 
    callback(); 
    // more work 
} 

Tương tự như vậy, có rất nhiều trường hợp sử dụng mà chúng tôi có thể có các biến chức năng có thể ghi đè. Đó là một mô hình phổ biến để đặt các loại biến này thành hàm rỗng làm giá trị mặc định để chúng ta có thể gọi chúng mà không lo lắng về việc liệu các biến đó có được gán/ghi đè hay không.

Ngoài ra, trong một số trường hợp đặc biệt, sẽ hữu ích khi có các hàm không làm gì ngoài trả về một giá trị cụ thể. makeEmptyFunction được sử dụng để tạo các chức năng như vậy. Về cơ bản, nó trả về một hàm không làm gì ngoài việc trả về thông số nào được truyền cho nó.

Như bạn có thể thấy trong tệp, mã ở trên tạo ra hàm trống trả về giá trị false.

"thành ngữ cuộc gọi rỗng" là thứ chúng tôi tìm thấy trong lập trình C-C/Cocoa. Về cơ bản nó cho phép bạn call a method of an uninitialized object (con trỏ rỗng) mà không đưa ra bất kỳ lỗi nào như trong hầu hết các ngôn ngữ khác. Tôi nghĩ đó là những gì tác giả đã cố gắng giải thích trong phần bình luận.

Vì JavaScript không có tính năng ngôn ngữ như vậy, chúng tôi rõ ràng đạt được nó bằng cách sử dụng các chức năng trống. Một số người gọi nó là no-op hoặc noop và bạn cũng có thể tìm thấy những người trợ giúp tương tự trong các thư viện JavaScript phổ biến khác như JQueryAngularJS.

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