JavaScript中最简单的自修改函数

Simplest self-modifying function in JavaScript?

本文关键字:修改 函数 最简单 JavaScript      更新时间:2023-09-26

我想研究和摆弄自修改函数,知道JavaScript有eval和其他有趣的反射式功能,比如让函数从内部打印它的主体,我想用JavaScript做一些自修改函数测试。

我想要一个简单的函数,当被调用时,它会根据任何规则来修改自己。

就像某个函数可以先做一个简单的console.log,然后下次调用它时,它会改为做alert。这显然可以用if来实现,但我在这里想要的是,实际的物理功能应该首先看起来像这样:

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

第一次通话后:

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

我怎样才能以最简单的形式实现这种行为?

这可能不是一个好的解决方案,但希望它能有所帮助。

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

仍然需要在不同的浏览器上进行测试。:)

如果你只需要它自己更改一次,那么你可以这样做:

var selfm = function () {
    console.log('hello');
    selfm = function () {
        alert('hello');
    };
};

selfm()函数将打印";你好";然后将其自身改变为显示";你好";之后每次都要提醒。

这在需要运行一些复杂代码的情况下可能很有用,但在运行一次之后,每次都会产生相同的结果。通过使用该方法,您可以优化这样的函数,使其立即返回相同的结果,而不是每次都重新进行计算。

//basic example
let myFunction=function(){
    console.log("previous code!");
    myFunction=new Function("console.log('new code!');");
}
myFunction(); //previous code!
myFunction(); //new code!
//Javascript self modifying function
function operation(operator,num1,num2){
  //storing reference 
  let temp=operation; 
  let mod=`"console.log(num1${operator}num2)"`;
  //performing modification 
  operation=new Function("num1,num2",eval(mod));
  operation(num1,num2);
  //restore original reference
  operation=temp;
}
operation("+",10,20); //30
operation("-",20,10); //10
operation("*",10,20); //200
operation("/",20,10); //2