Avatar billede pegasus72 Nybegynder
15. marts 2005 - 14:10 Der er 8 kommentarer og
1 løsning

mc.onRelease = minFunktion parantes {gør} kontra = minFunktion

Er der en der kan forklare på godt dansk hvad den helt præcise forskel er på at kalde en funktion vha. minFunktion() og uden ()?

Har set onRelease handlers der ikke kalder funktionen men sætter til at være = funktionen;

Hvad sker der helt præcis uden ()?

Skal assigne handlers til en bunke mc'er og vil gerne kalde en funktion i stedet for at definere funktionen til hvert mc men må lige forstå hvad der sker..
Avatar billede barklund Nybegynder
15. marts 2005 - 14:15 #1
Funktioner er variabler som alle andre. Hvis man skriver:

function minFunktion() {trace("hej");}

Så er "minFunktion" en reference til en funktion. Hvis man vil kalde funktionen skal man finde "noget", der er en reference til den og tilføje funktionskaldsoperatoren ():

minFunktion();
var x = minFunktion;
x();

Både minFunktion og x er nu referencer til den samme funktion - og kan derfor kaldes gennem begge variabler.

Dog vil jeg lige henvise din opmærksomhed på http://globe.dk/?action=detail&vare=FG227-7, der har et afsnit dedikeret til funktioner og som gennemgår lige præcis dette i ganske stor detalje :)

--
Morten Barklund
Avatar billede pegasus72 Nybegynder
16. marts 2005 - 10:27 #2
Lavede følgende:
function minFunktion() {
        if(this.flyttet == true) {
              this._xscale = 100;
              this.flyttet = false;
        } else {
              this.flyttet = true;
              this._xscale = 20;
        }
        };
_root.fader.barn.onRelease = minFunktion;
_root.fader.barn2.onRelease = minFunktion;

Det skalerer ikke op og ned men, (onRelease = minFunktion;) gør...
Hvorfor det, fatter minus!

Og ja, overvejer kraftigt at købe din bog, går det godt med salget? Der må være mange håbløse actionscript amatører som jeg selv, der kunne bruge noget dansk læsestof derude!
Avatar billede pegasus72 Nybegynder
16. marts 2005 - 10:27 #3
Svar tak!
Avatar billede barklund Nybegynder
16. marts 2005 - 10:33 #4
Dit script ser helt korrekt ud. Netop idet det flyttes til de to child-movieclips vil knap-funktionerne - når de køres - evaluere this til at være klippet selv. Og første gang man trykker vil this.flyttet ikke være true, så den skalerer ned til 20%. Ved andet tryk vil den derimod være true, så den skalerer op igen til 100%. Virker det ikke som ventet?

--
Morten Barklund
Avatar billede barklund Nybegynder
16. marts 2005 - 10:34 #5
Og mht. bogen er den jo sådan set ikke udkommet endnu - og derudover står jeg overhovedet ikke for noget som helst i forbindelse med salget :)
Avatar billede pegasus72 Nybegynder
16. marts 2005 - 10:39 #6
Jo det virker perfekt, fik lige rettet hurtigt nok der skulle have stået minFunktion();
Og det er det jeg ikke fatter!

Hvad er forskellen, skåret ud i pap, på minFunktion(); og minFunktion;
Det er det jeg ikke kan forstå!
Du kan godt se at jeg har problemer med at fatte hvad der kan kaldes hvorfra ikke?
Avatar billede barklund Nybegynder
16. marts 2005 - 10:44 #7
Hvis du skriver minFunktion() så kalder du funktionen. Prøv at kigge på:

var den_mindste = Math.min(1, 2);

Her kalder jeg funktionen og gemmer resultatet.

Skriver jeg:

var anden_funktion = Math.min;

Så laver jeg bare en ny reference til samme funktion - som jeg kan kalde igen:

var mindre = anden_funktion(0, 1);

Bare fordi det er en onRelease, så er der ikke noget specielt i det - du skal jo ikke kalde funktionen lige nu - den skal først kaldes når der trykkes på knappen. Skal en funktion kaldes nu, så kalder du den med parenteser og evt. parametre. Skal den _ikke_ kaldes nu, skal du lade være med at kalde den - meget simpelt :)

--
Morten Barklund
Avatar billede pegasus72 Nybegynder
16. marts 2005 - 11:03 #8
Aha... Dvs. at funktioner egentlig er variabler!
Der kan man bare se...
Så hvis minFunktion er scopet til _root, så skal jeg hvis jeg smider handleren i barn_mc så kalde den vha: this.onRelease = _root.minFunktion;, da det er en variabel og er initialiseret i _root... Eller?

Og tusind tak for fiffet!
Avatar billede barklund Nybegynder
16. marts 2005 - 11:18 #9
(jeg vil gerne lige henvise til min første kommentars første linje ;))

Du _kalder_ den ikke ved at skrive this.onRelease = _root.minFunktion - det har intet at gøre med at kalde en funktion.

Du sætter this.onRelease til at være det samme som _root.minFunktion er.

Hvis _root.minFunktion er 42, så er this.onRelease det samme. Hvis _root.minFunktion er en reference til en funktion, så er this.onRelease en reference til den samme funktion.

You see?

Hvornår funktionen så bliver _kaldt_ er noget helt andet. Det foregår på den måde, at når man trykker på et movieclip, så tester flash playeren, om movieclippets onRelease egenskab er sat til noget, der er en reference til en funktion. Er den det, kalder den funktionen.

Men du kalder ikke funktionen.

Man kan godt _kalde_ en onRelease:

function minFunktion() {
        if(this.flyttet == true) {
              this._xscale = 100;
              this.flyttet = false;
        } else {
              this.flyttet = true;
              this._xscale = 20;
        }
        };
_root.fader.barn.onRelease = minFunktion;
_root.fader.barn.onRelease();

Så kalder du den manuelt - med samme effekt, som blev den kaldt fra et klik.

Men der er meget mere at sige om emnet, hvis man vil forstå det til bunds - læs i bogen :)

--
Morten Barklund
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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