CHỈNH SỬA # 2: Tìm thấy lý do AirBnbs trong hướng dẫn kiểu Javascript của họ
Đừng quên đặt tên cho biểu thức - các hàm ẩn danh có thể khiến việc xác định vấn đề khó khăn hơn trong ngăn xếp lệnh gọi của Lỗi ( Thảo luận )
Câu trả lời gốc bên dưới
MDN có một bản tóm tắt tốt về cách hoạt động của suy luận tên hàm , bao gồm hai cảnh báo:
Quan sát
Có <function>.name
hành vi suy luận không chuẩn trong hai trường hợp sau:
- khi sử dụng trình thông dịch tập lệnh
Trình thông dịch tập lệnh sẽ đặt thuộc tính tên của hàm chỉ khi một hàm không có thuộc tính riêng được gọi là tên ...
- khi sử dụng công cụ js
Hãy cẩn thận khi sử dụng Function.name và các phép biến đổi mã nguồn, chẳng hạn như các phép biến đổi mã nguồn được thực hiện bởi trình nén JavaScript (bộ thu nhỏ) hoặc bộ obfuscators
....
Trong phiên bản không nén, chương trình chạy vào nhánh chân lý và ghi nhật ký 'foo' là một thể hiện của 'Foo' trong khi trong phiên bản nén, nó hoạt động khác và chạy vào nhánh khác. Do đó, nếu bạn dựa vào Function.name như trong ví dụ trên, hãy đảm bảo rằng đường dẫn xây dựng của bạn không thay đổi tên hàm hoặc không giả sử một hàm có một tên cụ thể.
Suy luận tên hàm là gì?
Các name
tài sản trả về tên của một hàm, hoặc (trước khi triển khai ES6) một chuỗi rỗng cho các chức năng ẩn danh
function doSomething() {}
console.log(doSomething.name); // logs "doSomething"
Các hàm được tạo với cú pháp mới Hàm (...) hoặc chỉ Hàm (...) có thuộc tính tên của chúng được đặt thành một chuỗi rỗng. Trong các ví dụ sau, các hàm ẩn danh được tạo, vì vậy tên trả về một chuỗi trống
var f = function() {};
var object = {
someMethod: function() {}
};
console.log(f.name == ''); // true
console.log(object.someMethod.name == ''); // also true
Các trình duyệt triển khai các hàm ES6 có thể suy ra tên của một hàm ẩn danh từ vị trí cú pháp của nó . Ví dụ:
var f = function() {};
console.log(f.name); // "f"
Ý kiến
Cá nhân tôi thích các hàm (mũi tên) được gán cho một biến vì ba lý do cơ bản:
Thứ nhất, tôi không bao giờ sử dụngfunction.name
Thứ hai, trộn phạm vi từ vựng của các hàm được đặt tên với phép gán có vẻ hơi lỏng lẻo:
// This...
function Blah() {
//...
}
Blah.propTypes = {
thing: PropTypes.string
}
// ...is the same as...
Blah.propTypes = {
thing: PropTypes.string
}
function Blah() {
//...
}
// ALTERNATIVELY, here lexical-order is enforced
const Blah = () => {
//...
}
Blah.propTypes = {
thing: PropTypes.string
}
Và thứ ba, tất cả mọi thứ đều bình đẳng, tôi thích các hàm mũi tên hơn:
- thông báo với người đọc rằng không có
this
, không, arguments
v.v. - trông đẹp hơn (imho)
- hiệu suất (lần cuối tôi xem xét, các hàm mũi tên nhanh hơn một chút)
CHỈNH SỬA: Ảnh chụp nhanh bộ nhớ
Tôi đang nghe Podcast và một vị khách được kể về một tình huống là anh ta phải đối mặt với những hạn chế của việc sử dụng các hàm mũi tên với cấu hình bộ nhớ, tôi cũng đã từng ở trong tình huống tương tự trước đây.
Hiện tại, ảnh chụp nhanh bộ nhớ sẽ không bao gồm tên biến - vì vậy bạn có thể thấy mình đang chuyển đổi các hàm mũi tên thành các hàm được đặt tên chỉ để kết nối với trình biên dịch bộ nhớ. Trải nghiệm của tôi khá đơn giản và tôi vẫn hài lòng với các chức năng mũi tên.
Thêm vào đó, tôi chỉ sử dụng ảnh chụp nhanh bộ nhớ một lần, vì vậy tôi cảm thấy thoải mái khi bỏ qua một số "dụng cụ" để có độ rõ ràng (chủ quan) theo mặc định.