10. marts 2007 - 16:52Der er
13 kommentarer og 1 løsning
caller.arguments og caller.name
Hej Jeg har et sæt funktioner. Jeg vil gerne kunne kalde "funktion b" som skal gøre noget, og derefter kalde den funktion der oprindeligt kaldte funktion b:
function a1(var1, var2) { b(); }
function a2(var1) { b(); } function b() { // Gør et eller andet, kald den funktion der oprindeligt kalte denne... }
Ovenstående er bare et eksempel, det vil ikke virke, men det er princippet i det... Jeg hvis a1 kalder b, skal b kalde a1 når den er færdig og på samme måde hvis det er a2.
Jeg ved man kan bruge: - b.caller.name - b.caller.arguments
MEN 1) for det første virker b.caller.name ikke i IE. Er der en smartere måde der virker både i IE, FF og safari? Hvis jeg kun bruger b.caller får jeg hele funktionen ud. Det er muligt at trække navnet ud fra den, men er det måden?
2) Jeg forstod det som om de to funktioner er blevet droppet officielt. Hvad bruger man så?
Jeg har "klassen" SliderObj. Den står for at udvide eller krympe et div. Jeg ville gerne kunne angive en funktion der kan kaldes når div har nået den højde der er angivet.
function SliderObj(_obj,h) { var obj = _obj; var targetHeight = h; var speed = 1; var swabFunc; var clearOnEnd; var FunctionEnd = null; var FunctionArgs = null;
Når jeg kalder GetComments og der er nogen divs der er foldet ud, folder den dem ind, og når de er det, kalder den funktionen igen, og folder den man gerne vil ha foldet ud, ud...
Du kan jo altid extend'e dine instanser af Function-objektet med en name-property:
function foo() { alert("dette er foo"); } foo.name = "foo";
Den måde kan godt blive bøvlet mange steder (f.eks. OOP og event-listener tildelinger). En bedre tilgang ville nok være at prototype en getName-metode på Function-objektet:
Function.prototype.getName = function() { if (typeof this.name!="string") { var a = (this+"").match(/function ([^\(]*)\(/); if (a&&a.length>0) return a[1]; } else if (this.name!="") return this.name; return "anonymous"; }
Her skal du dog være opmærksom på, at man ikke kan prototype på JS's native funktioner/metoder. Det vil udløse en fejl, at kalde getName-metoden på f.eks. window.alert! Da du selv nævner, at du skal bruge dette i forbindelse med 'caller', kan jeg dog ikke forestille mig, det vil være et problem =)
Du kan evt. prøve dette eksempel:
<script type="text/JavaScript"> Function.prototype.getName = function () { if (typeof this.name!="string") { var a = (this+"").match(/function ([^\(]*)\(/); if (a&&a.length>0) return a[1]; } else if (this.name!="") return this.name; return "anonymous"; }
function foo(fn) { alert("This is foo"); } foo.name = "foo";
Der er noget jeg ikke helt forstår, for i eksemplet med: function bar() { var fn = function(){}; alert("fn.getName(): " + fn.getName()); alert("foo.getName(): " + foo.getName()); alert("foo.name: " + foo.name); } kender man jo allerede foo, og man kan få navnet af den. Men hvis jeg skal finde navnet på den funktion der havde kaldt bar, kan det ikke gøres sådan her:
function foo() { bar() }
function bar() { var fn = function(){}; alert("fn.getName(): " + fn.getName()); alert("foo.getName(): " + foo.getName()); alert("foo.name: " + foo.name); }
yep... nu får jeg anonymous, som vel er fordi funktionen fn ikke har noget navn. this.getName() og this.name giver ingenting, den siger det ikke er funktioner...
Men i de 3 tilfælde her: var fn = function(){}; alert("fn.getName(): " + fn.getName()); alert("foo.getName(): " + foo.getName()); alert("foo.name: " + foo.name);
forespørger jeg jo på funktioner...jeg forstår ikke helt hvordan man, ud fra det, skal kunne finde ud af hvilken funktion der har kaldt den? (jeg har løst problemet ved at sende funktionsnavnet med som argument, men derfor er det da meget interessant ;) )
Var nød til bare at give funktionen med som argument.. ellers interssant, skal vi dele?
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.