Home Articles FAQs XREF Games Software Instant Books BBS About FOLDOC RFCs Feedback Sitemap
irt.Org
#

Q1234 How can a clone a function definition into a string object and then use the string object to recreate the function at a later point?

You are here: irt.org | FAQ | JavaScript | Function | Q1234 [ previous next ]

Michael Djoerby writes:

The function cloneFunctionToString( _func ) can from an arbitrary function produce a string. Example:

function testwithparm( _val1, _val2 )
{
alert( 'val1=' + _val1 );
alert( "val2=" + _val2 );
}

var str = cloneFunctionToString( testwithparm );

and then later, somewhere completely different the string can be evaluated to produce a real function again.

var testwithparmCloned = eval( str );

The advantage being the complete seperation from any object references like ex. the current document object.

The implementation is a bit tricky (traps here and there) but it seem to work fine even with different ' and " in the function.
<html>

<head>
<script language="JavaScript"><!--
function testwithparm( _val1, _val2 )
{
 alert( 'val1=' + _val1 );
 alert( "val2=" + _val2 );
}

function testnoparm()
{
 alert("Hello World!");
 alert("I have no parameters!");
}

function cloneFunctionToString( _func )
{
 // Find first the whole function string:
 var functionString = _func.toString();

 // Extract the function body:
 var bodyString     = functionString.substring( functionString.indexOf("{")+1, functionString.lastIndexOf("}") );

 // Extract the function argument:
 var functionArg = functionString.substring( functionString.indexOf("(")+1, functionString.indexOf(")") );

 // Build an array containing all function arguments:
 var argArray = functionArg.split(",");

 // Start building the cloning string:
 var retString = "new Function(";

 // Add paramters to cloning string:
 for ( var i = 0; i < argArray.length; i++ )
 {
  retString += "'" + argArray[i] + "',";
 }

 // Add function body to cloning string:
 retString += "'" + bodyString + "')";

 // The function body contains unwanted newlines, remove them:
 retString = retString.replace(/\n/g," ");
 return retString;
}

// Example: Function with parameters cloned:
var testwithparmCloned = eval( cloneFunctionToString( testwithparm ) );

// Example: Function without parameters cloned:
var testnoparmCloned = eval( cloneFunctionToString( testnoparm ) );

//--></script>
</head>

<body onLoad="testwithparmCloned('Hello','World'); testnoparmCloned();">
</body>

</html>

Feedback on 'Q1234 How can a clone a function definition into a string object and then use the string object to recreate the function at a later point?'

©2018 Martin Webb