Vì bạn đang sử dụng NET làm ví dụ, chúng ta hãy nghiên cứu kỹ một thời gian ngắn vào đó. Trong C#, bạn có thể tạo một hàm mà phải mất một Expression
:
void BadArgument<T>(Expression<Func<T>> argExpr)
{
}
Nhưng để có thể trích xuất các tên biến từ một cuộc gọi đến chức năng này, bạn sẽ phải chắc chắn rằng các cuộc gọi luôn luôn sử dụng chính xác cú pháp đúng (mặc dù không có cách nào để thực thi điều này tại thời điểm biên dịch):
if(x < 0)
BadArgument(() => x);
Vì vậy, nó có thể được thực hiện, nhưng rất mong manh và khá chậm. Về cơ bản, bạn đang tạo ra các hướng dẫn để tạo ra một cây biểu thức toàn bộ dựa trên biểu thức lambda () => x
, do đó hàm mà bạn gọi có thể phân tích cú pháp cây biểu thức đó và cố gắng tìm tên của đối số.
Điều này có thể thực hiện được trong javascript không? Chắc chắn rồi!
Trong javascript, đóng cửa được sản xuất thông qua các chức năng nội bộ, vì vậy tương đương với biểu thức lambda trên sẽ là:
function(){return x;}
Và kể từ javascript là một ngôn ngữ kịch bản, mỗi chức năng tương đương với định nghĩa riêng của mình như một chuỗi. Nói cách khác, gọi .toString()
vào chức năng trên sẽ mang lại:
function(){return x;}
This jsfiddle shows làm thế nào bạn có thể tận dụng điều này trong một chức năng khai thác gỗ theo phong cách. Sau đó bạn được tự do phân tích cú pháp chuỗi hàm kết quả, điều này sẽ chỉ rắc rối hơn một chút so với việc phân tích cú pháp cây biểu thức .NET. Hơn nữa, việc nhận giá trị thực tế của x
thậm chí còn dễ dàng hơn trong .NET: bạn chỉ cần call the function!
Nhưng chỉ vì bạn có thể không có nghĩa là bạn nên. Đó là tốt đẹp như một tiệm lừa gee-rít, nhưng khi nói phải xuống với nó, nó không phải là đáng giá:
- Đó là mong manh: những gì nếu một số nhà phát triển không sử dụng nó đúng đắn và mang đến cho bạn một hàm bạn không thể phân tích cú pháp?
- Nó không hoạt động với việc rút gọn: hãy tưởng tượng nhận được thông báo biến
a
có giá trị không chính xác vì hàm được rút gọn của bạn đã thay đổi tên biến của bạn.
- Nó bổ sung thêm chi phí: ngay cả bộ chỉnh sửa không thể rút ngắn
function(){return x;}
thành nhỏ hơn "x"
.
- Cuối cùng, nó phức tạp. 'nuff nói.
Giá trị chỉ ra: bạn không thể lấy tên biến thông qua phản ánh trong .NET. – StriplingWarrior
@StriplingWarrior. bạn có thể với 'Expression' tôi đơn giản hóa nó cho không có .Net phát triển ... – gdoron
tại sao không chỉ đăng nhập tên biến của bạn trong chuỗi? trong ví dụ của bạn, sẽ dễ dàng đặt x vào chuỗi 'console.log ('biến x có giá trị không hợp lệ:', x)' – SpYk3HH