Недавно у меня возникла необходимость переписать функцию javascript в javascript, динамически. Легкость, с которой я это сделал, и как это было весело, поразили меня.
Здесь у меня есть немного 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>
И я не мог изменить выводимый HTML, но мне нужно было добавить дополнительный параметр к этой ссылке. Я начал думать об этом и понял, что могу сделать это:
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&", "") + ';');
И это сработало как чемпион! excelExport.onclick возвращает объект функции, который я конвертирую в строку, и выполняю некоторые манипуляции со строками. Поскольку теперь это в форме "function () {...}", я просто возвращаюсь и назначаю его событию onclick объекта dom. Немного уродливо использовать eval, но на AFAIK нет конструктора функции javascript, который мог бы взять строку кода и красиво превратить ее в объект.
Во всяком случае, моя точка зрения не в том, что я супер умная (я не), моя точка зрения в том, что это круто . И я знаю, что JavaScript не единственный язык, который может это сделать. Я слышал, что у lisp были макросы в течение многих лет для этой конкретной цели. За исключением того, что вы действительно используете макросы, вам действительно нужно получать шутки, а я не шучу, я просто «вроде получаю».
Итак, мой вопрос: На каких других языках вы можете (легко) динамически переписывать функции, и можете ли вы показать мне простой пример? Я хочу посмотреть, где еще вы можете это сделать, и как это сделано!
(также я понятия не имею, что пометить, так как я взял случайные догадки)