ฉันจะเขียนฟังก์ชัน arrow ที่มีชื่อใน ES2015 ได้อย่างไร
คุณทำสิ่งที่คุณตัดออกในคำถามของคุณ: คุณวางไว้ที่ด้านขวามือของการกำหนดค่าเริ่มต้นหรือคุณสมบัติเริ่มต้นที่ตัวแปรหรือชื่อคุณสมบัติสามารถใช้เป็นชื่อโดยเอ็นจิน JavaScript ไม่มีวิธีอื่นที่จะทำ แต่การทำนั้นถูกต้องและครอบคลุมโดยข้อกำหนด
ตามข้อมูลจำเพาะฟังก์ชั่นนี้มีชื่อจริงsayHello
:
var sayHello = name => {
console.log(name + ' says hello');
};
สิ่งนี้ถูกกำหนดไว้ในตัวดำเนินการที่ได้รับมอบหมาย> ความหมายของรันไทม์: การประเมินผลที่เรียกการSetFunctionName
ดำเนินการเชิงนามธรรม (การเรียกนั้นอยู่ในขั้นตอนที่ 1.e.iii
เสมือนความหมายรันไทม์: การเรียกPropertyDefinitionEvaluationSetFunctionName
และทำให้ชื่อนี้เป็นฟังก์ชันจริง:
let o = {
sayHello: name => {
console.log(`${name} says hello`);
}
};
เอ็นจิ้นสมัยใหม่ตั้งชื่อภายในของฟังก์ชั่นสำหรับข้อความแบบนั้น; Edge ยังมีบิตที่ทำให้ใช้งานได้name
บนอินสแตนซ์ของฟังก์ชั่นด้านหลังธงรันไทม์
ตัวอย่างเช่นใน Chrome หรือ Firefox เปิดเว็บคอนโซลแล้วเรียกใช้ตัวอย่างนี้:
"use strict";
let foo = () => { throw new Error(); };
console.log("foo.name is: " + foo.name);
try {
foo();
} catch (e) {
console.log(e.stack);
}
ใน Chrome 51 ขึ้นไปและ Firefox 53 ขึ้นไป (และ Edge 13 ขึ้นไปด้วยการตั้งค่าสถานะทดลอง) เมื่อคุณเรียกใช้คุณจะเห็น:
foo.name คือ: foo
ความผิดพลาด
ที่ foo (http://stacksnippets.net/js:14:23)
ที่ http://stacksnippets.net/js:17:3
หมายเหตุและfoo.name is: foo
Error...at foo
ใน Chrome 50 และรุ่นก่อนหน้า, Firefox 52 และรุ่นก่อนหน้าและ Edge โดยไม่มีการตั้งค่าสถานะการทดลองคุณจะเห็นสิ่งนี้แทนเนื่องจากไม่มีFunction#name
คุณสมบัติ (ยัง):
foo.name คือ:
ความผิดพลาด
ที่ foo (http://stacksnippets.net/js:14:23)
ที่ http://stacksnippets.net/js:17:3
โปรดทราบว่าชื่อหายไปfoo.name is:
แต่จะแสดงในการติดตามสแต็ก เป็นเพียงว่าการใช้name
คุณสมบัติในฟังก์ชั่นนั้นมีความสำคัญต่ำกว่าคุณสมบัติ ES2015 อื่น ๆ Chrome และ Firefox มีตอนนี้ Edge มีด้านหลังธงโดยสันนิษฐานว่าจะไม่อยู่ด้านหลังธงนานนัก
เห็นได้ชัดว่าฉันสามารถใช้ฟังก์ชั่นนี้หลังจากที่ฉันได้กำหนดไว้เท่านั้น
แก้ไข. ไม่มีไวยากรณ์การประกาศฟังก์ชันสำหรับฟังก์ชันลูกศรเฉพาะไวยากรณ์นิพจน์ฟังก์ชันเท่านั้นและไม่มีลูกศรเทียบเท่ากับชื่อในรูปแบบเก่าที่ชื่อ function expression ( var f = function foo() { };
) ดังนั้นจึงไม่เทียบเท่ากับ:
console.log(function fact(n) {
if (n < 0) {
throw new Error("Not defined for negative numbers");
}
return n == 0 ? 1 : n * fact(n - 1);
}(5)); // 120
คุณจะต้องทำลายมันเป็นสองการแสดงออก(ฉันเถียงคุณควรจะทำอย่างนั้นอยู่แล้ว ) :
let fact = n => {
if (n < 0) {
throw new Error("Not defined for negative numbers.");
}
return n == 0 ? 1 : n * fact(n - 1);
};
console.log(fact(5));
แน่นอนถ้าคุณต้องวางสิ่งนี้ในที่ที่ต้องการนิพจน์เดียวคุณสามารถ ... ใช้ฟังก์ชั่นลูกศร:
console.log((() => {
let fact = n => {
if (n < 0) {
throw new Error("Not defined for negative numbers.");
}
return n == 0 ? 1 : n * fact(n - 1);
};
return fact(5);
})()); // 120
ฉันไม่ได้บอกว่ามันสวย แต่ก็ใช้ได้ดีถ้าคุณต้องการบวกกระดาษห่อนิพจน์