Gần đây tôi đã có sự cần thiết phải viết lại một hàm javascript trong javascript, động. Sự dễ dàng mà tôi đã làm nó, và nó thật thú vị, làm tôi kinh ngạc.Trong ngôn ngữ nào bạn có thể tự động viết lại các chức năng khi đang di chuyển?
Trên đây tôi đã có một số HTML:
<div id="excelExport1234"
onclick="if(somestuff) location.href='http://server/excelExport.aspx?id=56789&something=else'; else alert('not important');"
>Click here to export to excel</div>
Và tôi không thể thay đổi HTML outputted, nhưng tôi cần phải thêm một tham số phụ để liên kết đó. Tôi bắt đầu suy nghĩ về điều đó và nhận ra rằng tôi chỉ có thể làm điều này:
excelExport = $('excelExport1234');
if (needParam)
eval('excelExport.onclick = ' + excelExport.onclick.toString().replace("excelReport.aspx?id", "excelReport.aspx?extraParam=true&id") + ';');
else
eval('excelExport.onclick = ' + excelExport.onclick.toString().replace("extraParam=true&", "") + ';');
Và nó hoạt động như một nhà vô địch! excelExport.onclick trả về một đối tượng hàm mà tôi chuyển đổi thành một chuỗi và thực hiện một số thao tác chuỗi. Vì nó bây giờ ở dạng "function() {...}", tôi chỉ quay lại và gán nó cho sự kiện onclick của đối tượng dom. Đó là một chút xấu xí phải sử dụng eval, nhưng AFAIK không có một hàm dựng hàm javascript có thể lấy một chuỗi mã và biến nó thành một đối tượng độc đáo.
Dù sao, quan điểm của tôi không phải là tôi siêu thông minh (tôi không), quan điểm của tôi là điều này thật thú vị. Và tôi biết javascript không phải là ngôn ngữ duy nhất có thể làm được điều này. Tôi đã nghe nói rằng lisp đã có macro trong nhiều năm cho mục đích chính xác này. Ngoại trừ các macro thực sự grok bạn cần phải thực sự grok lisp, và tôi không grok nó, tôi chỉ 'loại nhận được nó'.
Vì vậy, câu hỏi của tôi là: Trong những ngôn ngữ nào bạn có thể (dễ dàng) tự động viết lại các hàm và bạn có thể chỉ cho tôi một ví dụ đơn giản không? Tôi muốn xem nơi nào khác bạn có thể làm điều này và cách thực hiện!
(còn, tôi không có ý tưởng gì để gắn thẻ này như, vì vậy tôi đã dự đoán ngẫu nhiên)
Bằng cách đó là sự điên rồ. – skaffman
Có thể là cộng đồng wiki? – ChristopheD
Tôi chưa bao giờ nói đó là điều thanh lịch nhất để làm, nhưng nó khá tuyệt. Nó giống như hầu hết các hacks twiddling bit - nguy hiểm gây ra họ có thể dựa vào triển khai trình biên dịch và như vậy, nhưng vẫn thông minh và thú vị. –