2015-12-17 5 views
-1

Я хотел бы исследовать и возиться с самомодифицирующими функциями и зная, что JavaScript имеет eval и другие интересные функции отражения, такие как функция, печатающая свое тело изнутри, я полагал, что хотел бы сделать некоторые самоотверженные функции, изменение функциональных тестов с помощью JavaScript.Простейшая функция самомодификации в JavaScript?

Я хочу иметь простую функцию, которая при вызове изменяет себя в соответствии с каким-либо правилом.

Возможно, какая-то функция может сначала сделать простой console.log, а в следующий раз, когда он будет называться, это сделает alert. Это может быть, очевидно, достигается с помощью if, но то, что я ищу здесь является то, что фактическая физическая функция должна первой выглядеть следующим образом:

function selfm() 
{ 
    console.log('hello') 
    // + modify self here somehow 
} 

И после первого звонка:

function selfm() 
{ 
    alert('hello') 
} 

Как может Я добился такого поведения в его простейшей форме?

+1

Или вы можете просто реализовать функцию, которая принимает функцию селектора и массив других функций для вызова. Поэтому селектор выбирает, какой из них вызывать, затем он будет вызываться. Ясность, простота в обслуживании/тестировании, отсутствие уродливых мутаций во время выполнения. – zerkms

+0

@zerkms Это не соответствует моей точке. Я хочу сделать функцию, которая может буквально редактировать себя изнутри, когда она вызывается, так что фактическая структура функции изменяется после вызова. Дело в том, чтобы полностью потерять информацию о том, как выглядела функция, прежде чем она была вызвана вообще. – Piwwoli

+1

Это не проблема - это уродливое решение. Объясните исходную проблему, требующую такого странного решения. – zerkms

ответ

1

Это может быть отличное решение, но надеюсь, что это поможет.

function selfm(str){ 
this.print = eval("(function a() {"+str+"})") ; 
this.print(); 
} 

И затем вы можете позвонить с любым строковым параметром, по которому вы хотите, чтобы ваша функция действовала как.

selfm("console.log('Hello');"); 
// will print Hello in console. 

selfm("alert('Hello');"); 
// will alert Hello 

Еще нужно протестировать на разных браузерах. :)

+0

Это действительно интересное решение в том смысле, что оно дает мне несколько хороших идей относительно того, что именно я пытаюсь достичь здесь. В некотором смысле это просто eval, завернутый в другую функцию, но это делает некоторые хорошие моменты. – Piwwoli