Thanks a lot, Neil
This is much better than ToExpression! And funcX is removed indeed.
I tried this before as well, but there is one problem: funcX is not defined as delayed set but is set immediately. You can see this if you do a "?funcX" after execution of your code. I added to your code a precedent funcX-definition (to see if it will be really removed), a Block and a final output of Information[funcX], funcX[a,b], funcX[3,2], funcX[a].
Remove[funcX];
funcX[z_] := Sin[z];(* Just for fun *)
ClearAll[a, b]
Block[{funcName, args, body, x, y},
funcName = "funcX";
args = {x, y};
body = (x + y)^2;
If[NameQ[funcName], Remove[Evaluate[funcName]]];
Evaluate[Symbol[funcName]] =
Function[Evaluate[args], Evaluate[body]];
];
{Information[funcX], funcX[a, b], funcX[3, 2], funcX[a]}

Unfortunatly we cannot write ":=" instead of "=" in the definition of funcX. This will become:

And we cannot write ":>" instead of "=". This will become:

I tried several things like
Evaluate[Symbol[funcName]]=Function[Evaluate[args],Defer[Evaluate[body]]];
But this didn't suceed either.
Any idea to overcome this?