2013-01-08 31 views

Trả lời

9

Về bản chất, đó là chức năng không hoạt động. Nó trả về giá trị của bất cứ thứ gì được truyền vào nó.

Phần này được sử dụng làm "trình lặp mặc định" trong chính thư viện có nghĩa là trong các hàm khác có thể có tham số "vòng lặp" tùy chọn (có khả năng được sử dụng làm hàm để áp dụng cho từng phần tử của mảng) của một số loại), nếu không có tham số vòng lặp nào được chuyển, thư viện sẽ sử dụng trình biến đổi "no-op" này và các phần tử của mảng sẽ không thay đổi.

+4

Chỉ vì lợi ích: Bạn có thể thấy nút này trong [nguồn chú thích] (http://underscorejs.org/docs/underscore.html#section-118). –

+0

@DanLee, tôi không thể đánh dấu nhận xét là câu trả lời. – SunnyShah

+0

@SunnyShah Đó không phải là câu trả lời của tôi, chỉ là bình luận của tôi. Tôi nghĩ bạn có thể đánh dấu câu trả lời từ Matt trong vài phút nữa. –

9

Một ví dụ cụ thể:

Underscore.js định nghĩa _.each và như như thế này.

_.each = function(obj, iterator, context) { 
    ... 
} 

Trình lặp này hiển thị giá trị el. Bạn có thể đã sử dụng thành ngữ này.

_.each([1, 2, 3], function(el){ 
    console.log(el); 
}); 

Công cụ lặp này trả về giá trị el mà không thay đổi.

_.each([1, 2, 3], function(el){ 
    return el; 
}); 

Hàm trả về giá trị không thay đổi xảy ra thường xuyên. Vì vậy, Underscore.js muốn xác định hàm. Underscore.js đặt tên hàm _.identity.

_.identity = function(value) { 
    return value; 
}; 

Nếu Underscore.js muốn sử dụng trình lặp mặc định, tất cả nhu cầu Underscore.js là gọi _.identity.

_.each([1, 2, 3], _.identity); 
+0

Sử dụng _.each hoàn toàn để trả lại nội dung không được đề xuất, đây là những gì _.map dành cho: '_.map ([1, 2, 3], function (el) { return el; }); ' Tốt để báo hiệu ý định của bạn với mã của bạn. Cú pháp tương tự của JavaScript và bản đồ được tách biệt tốt hơn, vì forEach không thu thập các kết quả hàm ngay cả khi có một câu lệnh trả về trong đó. –

28

Mẫu mã JavaScript liên quan đến nhận dạng là giá trị lọc dựa trên độ trung thực, ví dụ:

var a = [null, null, [1,2,3], null, [10, 12], null]; 

a.filter(_.identity) 

sản lượng [Array [3], Array [2]].

Sử dụng

_.compact(a) 

là rõ ràng hơn, nhưng người ta không thể sử dụng lodash hoặc gạch chân ở tất cả, ví dụ

function identity(x) { 
    return x; 
} 

a.filter(identity) 

Cho dù đó là mẫu mã tốt có vấn đề vì nhiều lý do, nhưng nó được sử dụng trong tự nhiên.

Nó không phải là NOOP chút nào. NOOP là cấu trúc bắt buộc, ví dụ: lắp ráp, trong khi lập trình hàm, nó giống như các hàm khác ở chỗ nó trả về một giá trị. Nếu danh tính là một NOOP, thì tất cả các hàm thuần túy cũng có thể được coi là noop, và nó sẽ không phải là một điều hợp lý.

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