Argument in recursieve functie steeds undefined

Status
Niet open voor verdere reacties.

Robin S

Gebruiker
Lid geworden
4 dec 2008
Berichten
246
Hi :)

Ik heb een probleem met de JS in de onderstaande code. De variabele indentLevel in mijn custom toString-functie voor arrays is iedere keer weer undefined, en ik heb geen idee waarom. Hopelijk is er hier iemand die dat wel heeft :)

[JS]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title></title>
<style type="text/css">
pre {
border: 1px dashed silver;
background-color: buttonface;
}
</style>
<script type="text/javascript">
String.prototype.htmlentities = function () {
return this.replace(/<|>|\n|\s/g, function (s) {
switch (s) {
case "<": return "&lt;";
case ">": return "&gt;";
case "\n": return "<br />";
case " ": return "&nbsp;";
}
});
};
Array.prototype.fill = function (value) {
for (var i = 0, l = this.length; i < l; i++) {
this = value;
}
return this;
};
Array.prototype.toString = function (indentLevel) {
if (!indentLevel) {
indentLevel = 0;
}

var indent = (new Array(indentLevel)).fill(" ").join("");
toPre(indentLevel);
var indentP = (new Array(indentLevel + 1)).fill(" ").join("");

var array = [];
for (var i = 0, l = this.length; i < l; i++) {
var value = (typeof(this) == "array" ? this.toString(indentLevel + 1) : this);
array.push(indentP + "[" + i + "] => " + value);
}
return "Array ( ~indentLevel: " + indentLevel + "\n" + array.join("\n") + indent + "\n)";
};

function toPre (text) {
var pre = document.createElement("pre");
if (text) {
pre.innerHTML = text.toString().htmlentities();
}
document.body.appendChild(pre);
return text;
}

window.onload = function () {
toPre([[4,5,6],[6,4,1],[]]);
};
</script>
</head>
<body></body>
</html>[/JS]
 
[JS] if (typeof(indentLevel) == "undefined") {
indentLevel = 0;
}[/JS] ?
 
Laatst bewerkt:
Nee, dat is het niet :( Immers, als (typeof(indentLevel) == "undefined"), dan ook (!indentLevel).
Edit: Het probleem is dus dat indentLevel steeds aan het begín van de functie undefined is. (Dit in plaats van eerst undefined, daarna 1, daarna 2, etc.)
De targeted browser is alleen FF overigens, goede kans dat 't hele script sowieso in IE niet werkt.
 
Laatst bewerkt:
Volgens mij werkt !indentLevel alleen wanneer je eerst intentLevel hebt gedeclareerd op undefined.
Ik heb !indentLevel geprobeerd in Chrome's console en krijg een error, met typeof krijg ik 0.
Wanneer indentLevel nooit gezet wordt naar 0, zal hij altijd undefined blijven..

Maar als je zegt dat het niet werkt dan is dat het probleem niet.
 
Dit was mn eigen test-code:[JS]
Array.prototype.woot = function(indentLevel)
{
indentLevel = indentLevel || 0;

var i, ret = '', len = this.length;

for(i=0; i<len; i++)
{

ret += 'IndentLevel ' + indentLevel + ', Item ' + i + '\n';

if(this instanceof Array)
{
ret += this.print_r(indentLevel + 1);
}else{
ret += '\t' + this + '\n';
}
}

return ret;
}[/JS]welke redelijk werkt. Hier is je eigen functie:[JS]
Array.prototype.toString = function (indentLevel) {
if (!indentLevel) {
indentLevel = 0;
}

var indent = (new Array(indentLevel)).fill(" ").join("");
toPre(indentLevel);
var indentP = (new Array(indentLevel + 1)).fill(" ").join("");

var array = [];
for (var i = 0, l = this.length; i < l; i++) {
var value = (this instanceof Array) ? this.toString(indentLevel + 1) : this;
array.push(indentP + "[" + i + "] => " + value);
}
return "Array ( ~indentLevel: " + indentLevel + "\n" + array.join("\n") + indent + "\n)";
};[/JS](het zat m dus in de typeof-regel. Nu is het instanceof. En dat werkt wel goed. Zie deze pagina voor moar uitleg.)



:thumb:
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan