Avatar billede idiotbarn Nybegynder
10. marts 2007 - 16:52 Der 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å?

Mvh
Avatar billede roenving Novice
10. marts 2007 - 16:55 #1
Hvad er dit scenarie, hvad skal du bruge det til ?-)
Avatar billede idiotbarn Nybegynder
10. marts 2007 - 18:38 #2
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;
   
    this.SetDesiredHeight = SetDesiredHeight;
    this.SwabAni = SwabAni;
    this.doAni = doAni;
    this.CallOnEndVars = CallOnEndVars;
    this.CallOnEnd = CallOnEnd;
       
    function CallOnEndVars(vars){FunctionArgs=vars}
    function CallOnEnd(name){FunctionEnd=name}
    function SetDesiredHeight(h){targetHeight = h}
   
    function doAni(_clearOnEnd)
    {
        clearOnEnd = _clearOnEnd;
        swabFunc = setInterval(SwabAni,20);
    }
    function SwabAni()
    {
        var height = parseInt(obj.offsetHeight);
        var deltaHeight = Math.abs(targetHeight-height);
       
        if(deltaHeight>20)
        {
            speed = 8;
        }
        else
        {
            speed = 2;
        }
       
        if(deltaHeight<=4)
        {
            obj.style.height=targetHeight+"px"
            clearInterval(swabFunc);
            if(clearOnEnd)
            {
                obj.innerHTML="";
            }
            if(FunctionEnd!=null)
            {
                var args = "";
                for(i=0;i<FunctionArgs.length;i++)
                {
                    args+=",'"+FunctionArgs[i]+"'";
                }
                if(args.length>0)
                {
                    args = args.substr(1);
                }
                eval(FunctionEnd+"("+args+")");
            }
            return;
        }
        if(height>targetHeight)
        {
            obj.style.height=(height-speed)+"px"
            if(initIframeHeight<currentIframeHeight)
            {
                AddIframeHeight((-1*speed));
            }
        }
        if(height<targetHeight)
        {
            obj.style.height=(height+speed)+"px"
            if(currentIframeHeight<parseInt(getElement(wrapperContainerName).offsetHeight))
            {
                AddIframeHeight(speed);
            }
        }
    }
}


Jeg gemmer div's der er foldede ud i variablen ActiveFields

function GetComments(id,selector,index,pagesize,divname)
{
    if(ActiveFields!=divname && ActiveFields.length>0)
    {
        SmoothCloseAndClear(ActiveFields);
        ActiveFields = "";
        return;
    }
   
    var parent = getElement(divname);
    if(parent.innerHTML.length==0 || getElement('div1').innerHTML!="Comments")
    {
        parent.innerHTML = "";
        AddCommentBox(divname);
    }

    getElement('div1').innerHTML="Comments";
    getElement('CommentPinkBottom').innerHTML="";
    getElement('CommentPinkContent').innerHTML="";


    CommentsManager.serverGetComments(id,selector,index,pagesize,getComments_Callback,divname);
}

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...
Avatar billede roenving Novice
10. marts 2007 - 23:07 #3
Hrm, måske skulle du kigge på noget simplere, f.eks. denne, jeg har pillet ved: http://www.eksperten.dk/spm/485556#rid4489881 ...
Avatar billede olebole Juniormester
15. marts 2007 - 15:10 #4
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";


function bar() {
    var fn = function(){};
    alert("fn.getName(): " + fn.getName());
    alert("foo.getName(): " + foo.getName());
    alert("foo.name: " + foo.name);
}
</script>

<button onclick="bar()">TEST</button>
Avatar billede olebole Juniormester
15. marts 2007 - 15:15 #5
Når du f.eks. skriver OO-kode, bør du så undgå at bruge anonyme funktioner. I stedet for:

function Foo() {
    /* Kode */

    this.doDaShit = function(){
        alert("Hej, det er mig!");
    }

    /* Kode */
    return this;
}

- bør du navngive funktionen, associeret med metoden:

function Foo() {
    /* Kode */

    this.doDaShit = function Foo_doDaShit(){
        alert("Hej, det er mig!");
    }

    /* Kode */
    return this;
}

- leg selv videre med idéen  ;o)
Avatar billede idiotbarn Nybegynder
17. marts 2007 - 13:50 #6
Hej ole.
Tak for responsen, men kræver det ikke at jeg på forhånd ved hvilken funktion det er der har kaldt den, eller er det mig der overser noget?

Ville gerne kunne bestemme hvilken funktion det var der kaldte den funktion man "sidder i" uden at vide noget om omgivelserne som sådan...
Avatar billede idiotbarn Nybegynder
17. marts 2007 - 13:56 #7
alternativt må jeg jo smide det med som argument eller et eller andet...ville bare være en rar løsning hvis man kunne finde den ud af luften
Avatar billede olebole Juniormester
20. marts 2007 - 12:53 #8
Hvis du tester det eksempel med prototyping, jeg viste, vil du opdage, du intet behøver at kende til omgivelserne  ;o)
Avatar billede idiotbarn Nybegynder
12. april 2007 - 01:44 #9
Hej igen og undskyld ventetiden

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);
}

Jeg tror der er et eller andet jeg misforstår...
Avatar billede roenving Novice
12. april 2007 - 01:54 #10
Prøv:

function bar() {
    var fn = function(){};
    alert("fn.getName(): " + fn.getName());
    alert("foo.getName(): " + this.getName());
    alert("foo.name: " + this.name);
}
Avatar billede idiotbarn Nybegynder
12. april 2007 - 02:12 #11
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...
Avatar billede olebole Juniormester
12. april 2007 - 13:46 #12
Netop - og derfor skrev jeg kommentaren: (15/03-2007 15:15:29) ... undgå anonyme funktioner  ;o)
Avatar billede idiotbarn Nybegynder
13. april 2007 - 13:02 #13
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 ;) )
Avatar billede idiotbarn Nybegynder
23. juni 2007 - 00:33 #14
Var nød til bare at give funktionen med som argument.. ellers interssant, skal vi dele?
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester