ฟังก์ชัน JavaScript ที่ไม่ระบุชื่อ f => f ทำอะไรกันแน่?


101

ฉันใช้ไลบรารีของบุคคลที่สามที่มีฟังก์ชันที่รับฟังก์ชันเป็นอาร์กิวเมนต์ ฉันกำลังตรวจสอบเงื่อนไขบางอย่างเพื่อตัดสินใจว่าจะเพิ่มฟังก์ชันใดฟังก์ชันหนึ่งเป็นพารามิเตอร์หรือไม่และในบางกรณีฉันไม่ต้องการให้ฟังก์ชัน การระบุค่าว่างในกรณีนั้นจะทำให้เกิดข้อผิดพลาด

ฉันพบรหัสนี้ซึ่งใช้งานได้ แต่ฉันไม่เข้าใจว่าเกิดอะไรขึ้น

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

คือf => fเทียบเท่ากับ() => {}ฟังก์ชั่นที่ไม่ระบุชื่อที่ว่างเปล่า?


3
มันส่งคืนตัวอักษรของวัตถุfตามMDN
Eli Sadoff

4
ไม่ว่างเปล่าโดยไม่ระบุชื่อเป็นข้อมูลประจำตัว
Davin Tryon

17
FWIW คุณสามารถติดโครงสร้างแบบนี้ลงใน Babel ได้บ่อยครั้งเพื่อดูว่า ECMAscript เวอร์ชันเก่ามีค่าเท่าไหร่
James Thorpe


คำตอบสำหรับstackoverflow.com/questions/24900875/…ไม่ได้ตอบคำถามนี้โดยตรง ฉันรู้ว่า f => f เป็นฟังก์ชันที่ไม่ระบุตัวตนฉันไม่เข้าใจว่ามันทำอะไร ฉันคิดว่าคำถามนี้เป็นกรณีเฉพาะและข้อมูลที่เฟลิกซ์คิงให้ไว้เกี่ยวกับฟังก์ชันการระบุตัวตนนั้นไม่ซ้ำกันสำหรับคำถามนี้
SomethingOn

คำตอบ:


114

f => f เหมือนกับ function(f){ return f; }

ใกล้มาก แต่ก็ไม่ใช่อย่างที่คุณคาดหวัง

* - ตามที่ได้ระบุไว้ในความคิดเห็นมีความแตกต่างเล็กน้อย แต่สำหรับคำถามของคุณฉันไม่คิดว่าคำถามเหล่านี้มีความเกี่ยวข้องเป็นพิเศษ มีความเกี่ยวข้องมากในสถานการณ์อื่น ๆ


2
ฉันสามารถนึกถึงความแตกต่างอย่างน้อยสองอย่างระหว่างf => fและfunction(f) { return f; }:)
Benjamin Gruenbaum

6
@BenjaminGruenbaum เจ๋งไปข้างหน้า - แม้แต่อัปเดตคำตอบนี้หากคุณคิดว่าเกี่ยวข้อง
Jamiec

4
ฉันไม่คิดว่ามันเกี่ยวข้องมากแค่คนอวดรู้: new (f => f)โยนมันมีความแตกต่างtoStringและด้วยเหตุผลบางอย่างฉันไม่สามารถส่งเสียงดัง(f => f).argumentsใน Chrome ได้ แต่ไม่ใช่ FF หรือ Edge
Benjamin Gruenbaum

5
@BenjaminGruenbaum การจัดการthisยังแตกต่างกัน (แม้ว่าความแตกต่างอาจไม่สามารถสังเกตได้หากthisไม่ปรากฏในเนื้อความของฟังก์ชัน ... ฉันไม่แน่ใจ)
Gregory Nisbet

184

f => fเป็นฟังก์ชั่นตัวตน เพียงแค่ส่งคืนอาร์กิวเมนต์ที่ส่งผ่านเข้ามา

ฟังก์ชันนี้มักใช้เป็นค่าเริ่มต้นสำหรับกระบวนการเปลี่ยนแปลงเนื่องจากไม่ได้ทำการแปลงใด ๆ

คือf => fเทียบเท่ากับ() => {}ฟังก์ชั่นที่ไม่ระบุชื่อที่ว่างเปล่า?

ไม่ฟังก์ชันว่างจะไม่ส่งคืนอะไรเลย ฟังก์ชัน identity จะส่งคืนอาร์กิวเมนต์ที่ส่งผ่าน


43
A + สำหรับระบุชื่อคำอธิบายและกรณีการใช้งานและตอบคำถามจริง
ขอบคุณ

19

หากคุณต้องการทราบความf => fหมายทางด้านซ้ายคือพารามิเตอร์และด้านขวาคือค่าที่ส่งกลับ ตัวอย่างเช่นf => f*2เทียบเท่ากับ:

function(f) { 
  return f * 2; 
}

รหัสที่คุณอธิบายจะส่งคืนสิ่งที่ป้อนให้เป็นอินพุต

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions


9

คนอื่น ๆ ได้พูดถึงสิ่งที่f => fทำแล้วดังนั้นฉันจะไม่ลงลึกไปมากกว่านั้น ฉันจะอธิบายฟังก์ชันที่เหลือเพราะมีความแตกต่างเล็กน้อยระหว่างf => fและ__DEV__ ? devTools() : f => f

ตรวจสอบผู้ประกอบการ ternary ถ้า__DEV__คุ้มค่า truthy devTools()และถ้าเป็นเช่นนั้นก็กลับมาฟังก์ชั่น มิฉะนั้นจะส่งคืนฟังก์ชันเอกลักษณ์f => fซึ่งไม่ทำอะไรเลย ใส่ให้แตกต่างกัน: รหัสนี้เปิดใช้งานฟังก์ชันโหมดการพัฒนาบางอย่าง หากไม่มีรหัสที่เหลือก็ยากที่จะบอกได้ว่าโหมดนี้เพิ่มอะไรบ้าง แต่น่าจะช่วยให้สามารถใช้ข้อมูลการบันทึกเพิ่มเติมและทำให้สับสนน้อยลง


__DEV__ ? devTools() : f => ffทำอะไรไม่ได้กำหนดที่จะ คุณทิ้งบางสิ่งบางอย่างออกจากตัวอย่างโค้ดหรือไม่?
Felix Kling

2
มันจะไม่ส่งคืนฟังก์ชันมันจะส่งคืนผลลัพธ์ของฟังก์ชัน
Stephan Bijzitter

1
อวาตาร์ของคุณทำให้ฉันรำคาญและรบกวนวันของฉัน ฉันรู้สึกเหมือนยุค 90 และโมเด็มของฉันขาดการเชื่อมต่อ ยังไงก็ +1 อยู่ดีสำหรับคำตอบที่ดี
Konrad Viltersten

@KonradViltersten คุณไม่ใช่คนแรกที่แสดงความคิดเห็นเกี่ยวกับอวตารของฉัน คุณเป็นคนแรกที่ไม่ชอบมัน คนส่วนใหญ่ชื่นชมปัจจัยแห่งความคิดถึงและความคาดหวังเล็ก ๆ น้อย ๆ ที่เรียกร้อง
Nzall

1
ฉันหวังว่าคุณจะได้ประชดเพื่อน แน่นอนว่ามันเป็นเรื่องตลก เห็นได้ชัดว่าฉันชอบมันและฉันพบว่ามันสดชื่นแบบดั้งเดิม
Konrad Viltersten

9

เมื่อใดก็ตามที่มีภาวะที่กลืนไม่เข้าคายไม่ออกคุณสามารถใช้Babel ได้เพื่อรับคำตอบ

มันกลับมาเช่นนี้:

"use strict";

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

BTW, =>ที่คุณใช้เป็นคุณลักษณะ ES6 เรียกว่าการแสดงออกของลูกศร การแสดงออกของความสนใจอื่น ๆ

() => {};  // es6

จะแปลงเป็น:

(function () {});

เนื่องจากนิพจน์ฟังก์ชันลูกศรมักไม่ระบุชื่อจึงเหมาะสมหากคุณเพิ่มชื่อให้กับฟังก์ชัน:

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

จะแปลงเป็น

var empty = function empty() {}; 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.