Home Articles FAQs XREF Games Software Instant Books About Feedback Search Site-Map
irt.org logo

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?

irt.org | Knowledge Base | JavaScript | Function | Q1234 [ previous next ]

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?

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?'


Provide feedback ...
AddThis Social Bookmark Button

Provide feedback ... AddThis Social Bookmark Button


Last Updated: 30th March 2008. Maintained by: Martin Webb and Michel Plungjan
irt.org liability, trademark, document use, privacy statement and software licensing rules apply.
Copyright © 1996-2008 irt.org, All Rights Reserved.