Už párkrát jsem byl nucen použít JS kód uložený v řetězci, a tedy vím, jak snadno se stane žroutem času překlep/chyba v syntaxi|sestavení;
dlouhé sekvence příkazů se stávají nepřehlednými díky nemožnosti zapsat řetězec na více řádků (leda pomocí CONCATenace).
Nelze použít debugging či zvýrazňovač syntaxe......ledaže by:
Existuje snadný způsob jak příkazy zapsat v běžné víceřádkové formě do těla jakékoliv funkce a příkazový řetězec vygenerovat:
Následující ukázka je určena pro Mozillu/FF: [Používá metodu toSource a konzoli Firebugu]
1. Přiřadíme objektu Function tyto metody:
Function.prototype.toCmdLine=
function(){ return this.toSource().replace(/^\(?function[^{]+{(.+)}\)?$/,'$1'); } ;
Function.prototype.toCmdString=
function(){ return '"' + this.toCmdLine().replace(/(["\\])/g, '\\$1') + '"'; } ;
Function.prototype.logCmds=
function(){ console.log("CmdLine:\n %s \nCmdString:\n %s \n",this.toCmdLine(),this.toCmdString()); }
2. Blok příkazů vložený do funkce xxx, řetězec vygeneruje volání: xxx.toCmdLine()
Případně lze použít anonymní funkci - vše obstará jediný výraz: function(){p1;p2...}.toCmdLine()
[Jako uvozovací znak používat pouze " ]
/***** příklad použití řetězce ve funkci setTimeout ******/
setTimeout( function()
{
var outp;
var src = Function.prototype;
for(var f in src)
if(typeof src[f]=="function"){
outp = "METODA: " + f + "\n\n" + src[f].toString();
alert(outp);
}
}
.toCmdLine() , 2000 )
3. Pro použití např. v záložkových aplikacích potřebujeme řetězec jako čistý literál bez nevýznamných mezer=whitespace znaků.
Takový generuje metoda toCmdString, nejpraktičtější je vypsat tento literál do okna konzole a zkopírovat z něj:
(function(){
var src=Function.prototype;
for(var f in src){
if(typeof src[f]=="function"){
alert("METODA: " + f + "\n\n" + src[f].toString());
};}
})
.logCmds();
========================================= CONSOLE ================================================================================================
CmdLine:
var src = Function.prototype;for (var f in src) {if (typeof src[f] == "function") {alert("METODA: " + f + "\n\n" + src[f].toString());}}
CmdString:
"var src = Function.prototype;for (var f in src) {if (typeof src[f] == \"function\") {alert(\"METODA: \" + f + \"\\n\\n\" + src[f].toString());}}"
==================================================================================================================================================
Univerzální metody - funkční nejen v FF: [Při nepřítomnosti toSource/konzole se použije: toString/prompt]
Function.prototype.logCmds = (window.console) ?
function(){ console.log("CmdLine:\n %s \nCmdString:\n %s \n",this.toCmdLine(),this.toCmdString()); }
: function(){ prompt("CmdLine:",this.toCmdLine()); prompt("CmdString:",this.toCmdString()); } ;
Function.prototype.toCmdLine = (Function.toSource) ?
function(){ return this.toSource().replace(/^\(?function[^{]+{(.+)}\)?$/,'$1'); }
: function(){ return this.toString().replace(/[\n\r]/gm,'').replace(/^\(?function[^{]+{(.+)}\)?$/,'$1'); } ;
Function.prototype.toCmdString =
function(){ return '"' + this.toCmdLine().replace(/(["\\])/g, '\\$1') + '"'; } ;