Chính xác thì hàm ẩn danh trong JavaScript f => f làm gì?


101

Tôi đang sử dụng thư viện của bên thứ ba có một hàm nhận các hàm làm đối số. Tôi đang thực hiện một số kiểm tra có điều kiện để quyết định có thêm một hàm cụ thể làm tham số hay không và trong một số trường hợp, tôi không muốn cung cấp một hàm. Cung cấp null trong trường hợp đó sẽ tạo ra lỗi.

Tôi tìm thấy mã này hoạt động, nhưng tôi không hoàn toàn hiểu điều gì đang xảy ra.

compose(__DEV__ ? devTools() : f => f)

f => ftương đương với () => {}một chức năng ẩn danh trống không?


3
Nó trả về một đối tượng theo nghĩa đen của f, theo MDN
Eli Sadoff

4
không trống rỗng ẩn danh, đó là danh tính.
Davin Tryon

17
FWIW, bạn thường có thể gắn các cấu trúc như thế này vào babel để xem các cấu trúc tương đương trong các phiên bản cũ hơn của ECMAscript là như thế nào.
James Thorpe


Câu trả lời cho stackoverflow.com/questions/24900875/… không trực tiếp trả lời câu hỏi này. Tôi biết f => f là một hàm ẩn danh, tôi chỉ không hiểu chính xác nó đang làm gì. Tôi nghĩ câu hỏi này là một trường hợp cụ thể và thông tin do Felix King cung cấp về các chức năng nhận dạng là duy nhất cho câu hỏi này.
SomethingOn

Câu trả lời:


114

f => f tương tự như function(f){ return f; }

Thật gần, nhưng không hoàn toàn như những gì bạn mong đợi.

* - như đã được chỉ ra trong các nhận xét, có những khác biệt nhỏ, nhưng vì lợi ích của câu hỏi của bạn, tôi không nghĩ rằng chúng có liên quan đặc biệt . Chúng rất phù hợp trong các tình huống khác.


2
Tôi có thể nghĩ đến ít nhất hai sự khác biệt giữa f => ffunction(f) { return f; }:)
Benjamin Gruenbaum

6
@BenjaminGruenbaum thú vị, hãy tiếp tục - thậm chí cập nhật câu trả lời này nếu bạn cho rằng nó có liên quan.
Jamiec

4
Tôi không nghĩ rằng nó có liên quan lắm, chỉ là một bàn đạp: new (f => f)ném, nó có một cái khác toStringvà vì một số lý do tôi không thể tìm thấy (f => f).argumentstrong Chrome mà không phải FF hoặc Edge.
Benjamin Gruenbaum

5
@BenjaminGruenbaum việc xử lý thiscũng khác nhau. (mặc dù sự khác biệt có thể không thể quan sát được nếu thiskhông xuất hiện trong các cơ quan chức năng ... Tôi không chắc chắn)
Gregory Nisbet

184

f => fchức năng nhận dạng . Nó chỉ trả về đối số đã được truyền vào.

Hàm này thường được sử dụng làm giá trị mặc định cho các quá trình chuyển đổi, vì nó không thực hiện bất kỳ chuyển đổi nào.

f => ftương đương với () => {}một chức năng ẩn danh trống không?

Không. Hàm trống không trả về bất kỳ thứ gì. Hàm nhận dạng trả về đối số được truyền vào.


43
A + để cung cấp tên, giải thích và trường hợp sử dụng cũng như trả lời câu hỏi thực tế.
Cảm ơn bạn


9

Những người khác đã đề cập đến những gì f => fkhông, vì vậy tôi sẽ không đi sâu hơn vào điều đó. Tôi chỉ giải thích phần còn lại của hàm, bởi vì có một chút khác biệt giữa f => f__DEV__ ? devTools() : f => f

Toán tử bậc ba kiểm tra xem __DEV__có phải là giá trị trung thực hay không và nếu có, nó trả về hàm devTools(). nếu không, nó trả về hàm nhận dạng f => fmà không làm gì cả. Nói cách khác: mã này cho phép một số chức năng của chế độ phát triển. Nếu không có mã còn lại, thật khó để biết chế độ này bổ sung những gì, nhưng có lẽ, nó sẽ cho phép một số thông tin ghi nhật ký bổ sung và ít xáo trộn hơn.


__DEV__ ? devTools() : f => fkhông gán bất cứ điều gì cho f. Bạn có bỏ sót điều gì đó từ ví dụ mã không?
Felix Kling

2
Nó sẽ không trả lại chức năng, nó sẽ trả lại kết quả của hàm
Stephan Bijzitter

1
Ảnh đại diện của bạn làm phiền tôi và làm phiền một ngày của tôi. Tôi cảm thấy như những năm 90 và modem của tôi bị mất kết nối. Dù sao, vẫn +1, để có câu trả lời hay.
Konrad Viltersten

@KonradViltersten Bạn không phải là người đầu tiên nhận xét về ảnh đại diện của tôi. Bạn là người đầu tiên không thích nó. Hầu hết mọi người đều đánh giá cao yếu tố hoài cổ và sự hạ thấp kỳ vọng mà nó gây ra.
Nzall

1
Tôi hy vọng rằng bạn đã gặp phải tình huống trớ trêu, anh bạn. Tất nhiên, nó có nghĩa là một trò đùa. Rõ ràng, tôi thích nó và tôi thấy nó nguyên bản mới mẻ.
Konrad Viltersten

9

Bất cứ lúc nào gặp tình huống khó xử tương tự, bạn có thể sử dụng Babel để tìm câu trả lời.

Nó trả về như thế này:

"use strict";

(function (f) {
  return f;
});

BTW, => bạn đã sử dụng là tính năng ES6 gọi là biểu thức mũi tên . Biểu hiện quan tâm khác

() => {};  // es6

sẽ chuyển đổi thành:

(function () {});

Vì các biểu thức hàm mũi tên luôn ẩn danh nên sẽ hợp lý nếu bạn thêm tên vào hàm:

let empty = () => {}; // es6

sẽ chuyển đổi thành

var empty = function empty() {}; 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.