Недавно мне пришлось переписывать 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 были макросы в течение многих лет для этой конкретной цели. За исключением действительно макросов макросов, вам нужно действительно заглянуть в lisp, и я не понимаю, я просто «получаю это».
Так что мой вопрос: На каких других языках вы можете (легко) динамически переписать функции, и можете ли вы показать мне простой пример? Я хочу посмотреть, где еще вы можете это сделать, и как это делается!
(также, я понятия не имею, что это как помечать, так что я взял случайные догадки)
Таким образом, это безумие. – skaffman
Возможно, сообщество wiki? – ChristopheD
Я никогда не говорил, что это самая элегантная вещь, но это довольно круто. Это похоже на большинство бит-халатов - опасная причина, по которой они могут полагаться на реализации компилятора и такие, но все же умные и интересные. –