简体   繁体   中英

Replacing function contents dynamically in JavaScript

How do you completely replace a function in JavaScript?

I got this code, but it doesn't work. The DOM gets updated, though. What's up with that?

<html>
<head>
    <script id="myScript" type="text/javascript">
        function someFunction() {
            alert("Same old.");
        }
    </script>
</head>
<body>

<input type="button" onclick="someFunction();" value="A button." />
<script>
    function replace() {
        var oldFunctionString = someFunction.toString();
        var oldContents = oldFunctionString.substring(oldFunctionString.indexOf("{") + 1, oldFunctionString.lastIndexOf("}") );
        var newCode = "alert(New code!);";        
        var newFunctionString = "function someFunction(){"+newCode+"}";
        var scriptTag = document.getElementById('myScript');

        scriptTag.innerHTML = scriptTag.innerHTML.replace(oldFunctionString,newFunctionString);
    }

    replace();
</script>

</body>
</html>

JSfiddle here

Setting .innerHTML doesn't re-execute a script. If you really wanted to do that, you'd have to create a new script element and append it to the DOM, which then overwrites what the previous script has done (not possible in all cases, of course).

If you want to replace that function, just use

somefunction = function() {
    alert(New code!); // syntax error, btw
};

Of course, to replace only parts of the code (not knowing all of it) you could try regex and co. Still just reassign the new function to the variable:

somefunction = eval("("
  + somefunction.toString().replace(/(alert\().*?(\);)/, "$1New code!$2")
  + ")");

It seems you are trying to work with strings, not the function itself. Just do this instead:

someFunction = function () { /* your function code here */ }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM