Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Javascript - koodi lahtimõtestamine märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
mine lehele 1, 2  järgmine
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
Taux007
HV veteran
Taux007

liitunud: 27.08.2005




sõnum 20.12.2012 08:30:47 Javascript - koodi lahtimõtestamine vasta tsitaadiga

Hei, paluks Teilt abi ühe koodiosa lahtimõtestamisel, millega ise hätta jään. (Kuna tegu on veebikeskkonna codeacademy.com poolt pakutud ülesandega ja selle eest on ka arvestus kätte saadud, siis kodutööks ta vast ei kvalifitseeru. Olgu öeldud, et arvestuse saamiseks ei pidanud muud tegema kui "RUN" nuppu vajutama).

tsitaat:
var power = function (base, exponent) {
var result = 1;
for (var i = 0; i < exponent; i++) {
result = result * base;
}
return result;
};

power(4, 3);

1) Väärtustatakse funktsioon power kahe parameetriga: base, exponent
2) Väärtustatakse muutuja result ühega - miks?
Edasi läheb keeruliseks. For käsust saan aru kuniks result = result * base juurde jõuan.
Kommentaarid: 47 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 46
tagasi üles
vaata kasutaja infot saada privaatsõnum
Sold OUT
no credit
Sold OUT

liitunud: 30.07.2002



Autoriseeritud ID-kaardiga

sõnum 20.12.2012 08:33:19 vasta tsitaadiga

For pole otseselt käsk vaid tsykkel mis toimetab kuni temale seatud tingimus on täidetud.
_________________
People have been calling for a month and we've been sold out for a week or so.
Kommentaarid: 92 loe/lisa Kasutajad arvavad:  :: 5 :: 1 :: 79
tagasi üles
vaata kasutaja infot saada privaatsõnum
infidel
HV kasutaja
infidel

liitunud: 31.01.2004




sõnum 20.12.2012 10:08:00 vasta tsitaadiga

Puust ja punaseks, kommentaar iga rea järel:
javascript:
  1. var power = function (base, exponent) { //  alustatakse funktsioon power (astendamine) defineerimist, sisendiks on kaks parameetrit base, exponent - maakeeli alus ja astendaja
  2. var result = 1;   //  Määratakse väljundi väärtuseks 1 ehk arv astmes 0.
  3. for (var i = 0; i < exponent; i++) { // Et saada lõplikku vastust, tuleb alust korrutada iseendaga astendajaga võrdne arv kordi. Selleks alustatakse tsüklit, kus järjekorranumber i alustab nullist ja suureneb iga sammuga ühe võrra. Tsükkel kestab senikaua, kui i on väiksem kui astendaja.
  4. result = result * base; // Väljund korrutatakse alusega. Esimene kord on see 1*alus (astmes 1), sealt edasi alus*alus (astmes 2), siis alus*alus*alus (astmes 3) ja nii edasi.
  5. } //Tsükli lõpp
  6. return result; // Tagastatakse väljund
  7. }; //Funktsiooni lõpp
  8.  
  9. power(4, 3); // Funktsiooni toimimise kontroll, mis peaks tagastama 4 astmes 3 ehk 64.
  10.  
Kommentaarid: 36 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 35
tagasi üles
vaata kasutaja infot saada privaatsõnum
Taux007
HV veteran
Taux007

liitunud: 27.08.2005




sõnum 20.12.2012 10:24:04 vasta tsitaadiga

infidel, thumbs_up.gif tänud.

Loogika jah selles, et ta jätab eelmise i juures resulti meelde ning hiljem oskab seda resulti uuesti kasutada astendajaga korrutamisel.
Kommentaarid: 47 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 46
tagasi üles
vaata kasutaja infot saada privaatsõnum
andris9
HV vaatleja
andris9

liitunud: 14.06.2011




sõnum 20.12.2012 17:13:07 vasta tsitaadiga

Igaks juhuks märgin ära, et javascript sisaldab juba sarnast funktsiooni ja seega ise astendamist korraldama ei pea

Math.pow(base, exponent)


Math.pow(4, 3) == 64


Lisaks saab see hakkama ka negatiivsete ja murdarvuliste astmetega, millega eelpoolkirjeldatud funktsioon toime ei tule.
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Taux007
HV veteran
Taux007

liitunud: 27.08.2005




sõnum 26.12.2012 02:00:37 vasta tsitaadiga

thumbs_up.gif Kuna praegu on selle codeacademy.com Javascripti osa õppe eesmärk ilmselt õppurit mõtlema panna, siis seetõttu ka selliseid koodijuppe tarvitatakse seal.

EDIT
function Company(name,yearFounded,profitLevel) {
   this.name = name;
   this.year = yearFounded;
   this.profits = profitLevel;
   var bankBalance = 20;
   this.getBalance = function (){
      return bankBalance - 2;
   };
}

Äkki keegi oskab nüüd kerge briefi üle teha this kasutamisest? Samuti tekitab probleeme see, et kui function (bankBalance) kirjutasin, siis tuli NaN vastuseks, kui sulud tühjaks jäävad, siis on vastus olemas. Miks see nii on?
Kommentaarid: 47 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 46
tagasi üles
vaata kasutaja infot saada privaatsõnum
infidel
HV kasutaja
infidel

liitunud: 31.01.2004




sõnum 28.12.2012 10:18:30 vasta tsitaadiga

Taux007 kirjutas:
Äkki keegi oskab nüüd kerge briefi üle teha this kasutamisest? Samuti tekitab probleeme see, et kui function (bankBalance) kirjutasin, siis tuli NaN vastuseks, kui sulud tühjaks jäävad, siis on vastus olemas. Miks see nii on?

Koodi ülevaade
javascript:
  1.  
  2. function Company(name,yearFounded,profitLevel) {  //Luuakse funktsioon Firma, mille sisenditeks on nimi, asutamise aasta ja kasumlikkus. Hiljem on sellena võimalik oma muutujaid määrata.
  3.    this.name = name;           //tulevase muutuja parameeter nimi saab väärtuse vastavalt sisendile
  4.    this.year = yearFounded; //sama asutamise aasta kohta
  5.    this.profits = profitLevel; //ja kasumlikkusega ka
  6.    var bankBalance = 20//määratakse tulevase muutuja kontojäägiks 20
  7.    this.getBalance = function (){ //luuakse alamfunktsioon kontojäägi näitamiseks,
  8.                 return bankBalance - 2; //mis annab vastuseks kontojääk - 2.
  9.    }; //alamfunktsioon kinni
  10. } //funktsiooni lõpp
  11.  

Sealt edasi - kuidas neid väärtusi kätte saada:
javascript:
  1.  
  2. var Firma = new Company("AS Mida Iganes", "2012", 100); //defineerime uue muutuja
  3. console.log(Firma.name)//kõik eelnevalt this abil määratud asjad saab nüüd kätte kujul muutuja.parameeter
  4. console.log(Firma.year);
  5. console.log(Firma.profits);
  6. console.log(Firma.getBalance())//Kuna funktsioon on defineeritud ilma sisendparameetriteta, ei saa neid ka praegu lisada. Vastasel korral tulebki NaN, kuna funktsioon ei oska parameetriga midagi peale hakata.
  7.  


viimati muutis infidel 28.12.2012 14:02:40, muudetud 1 kord
Kommentaarid: 36 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 35
tagasi üles
vaata kasutaja infot saada privaatsõnum
Taux007
HV veteran
Taux007

liitunud: 27.08.2005




sõnum 28.12.2012 13:30:32 vasta tsitaadiga

Uue muutuja puhul nüüd kui soovime konsooli logida tema asutamise aasta, siis antud näite põhjal peaks kirjutama?
console.log(Firma.yearFounded);


Või kuidas programm sellest aru saama peaks? Mingi eesmärk on ju this.year täita?
Kommentaarid: 47 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 46
tagasi üles
vaata kasutaja infot saada privaatsõnum
infidel
HV kasutaja
infidel

liitunud: 31.01.2004




sõnum 28.12.2012 14:03:27 vasta tsitaadiga

Näpukas, peab olema console.log(Firma.year);
Parandasin eelmises postituses ära.
Kommentaarid: 36 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 35
tagasi üles
vaata kasutaja infot saada privaatsõnum
Taux007
HV veteran
Taux007

liitunud: 27.08.2005




sõnum 28.12.2012 14:12:06 vasta tsitaadiga

Vägev! icon_smile.gif Tänud sulle!

Kui veel viitsid, siis mul ka probleem selle "ülesandega". S.t. ta on läbitud ja ok, aga ma ei saa väga aru, mis teed pidi ta need vastused saab.
function BankAccount( lastname ) { //funktsiooni BankAccount loomine, sisendiks perekonnanimi
    this.lastname = lastname; // Väärtustame public variable inputiga, et saaks mujal kasutada
    this.balance = 1000000;    // Balance = 10000000;
}

function attackBalance(account){ // Funktsioon konto häkkimiseks. Siin on miskitpärast inputiks account
   account.balance  = 5; // Account.balance saab juurdepääsu BankAccount funktsioonile ning muudab tema väärtuse viieks - kuidas account teab "rünnata" Jonesi?
}


var jonesBankAccount = new BankAccount ("Jones");

console.log("jonesBankAccount has " + jonesBankAccount.balance + " dollars!");
attackBalance(jonesBankAccount);
console.log("After attack, jonesBankAccount has " + jonesBankAccount.balance + " dollars!");
Kommentaarid: 47 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 46
tagasi üles
vaata kasutaja infot saada privaatsõnum
infidel
HV kasutaja
infidel

liitunud: 31.01.2004




sõnum 28.12.2012 14:28:07 vasta tsitaadiga

Koodi kommentaarid kergelt muudetult:
javascript:
  1.  
  2. function BankAccount( lastname ) { //funktsiooni BankAccount loomine, sisendiks perekonnanimi
  3.     this.lastname = lastname; // Väärtustame public variable inputiga, et saaks mujal kasutada
  4.     this.balance = 1000000;    // Balance = 10000000;
  5. }
  6.  
  7. function attackBalance(account){ // Konto ründamise funktsioon. Sisendiks on eelmise funktsiooniga loodud BankAccount tüüpi muutuja.
  8.    account.balance  = 5; // Võetakse sisendiks antud BankAccount ja tema .balance saab väärtuse 5.
  9. }
  10.  
  11. var jonesBankAccount = new BankAccount ("Jones"); //Uue konto loomine.
  12.  
  13. console.log("jonesBankAccount has " + jonesBankAccount.balance + " dollars!"); //kontoseisu logimine
  14. attackBalance(jonesBankAccount); //Rünnak konto vastu. Võrdne sellise reaga: jonesBankAccount.balance  = 5;
  15. console.log("After attack, jonesBankAccount has " + jonesBankAccount.balance + " dollars!"); //uue seisu logimine
Kommentaarid: 36 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 35
tagasi üles
vaata kasutaja infot saada privaatsõnum
Taux007
HV veteran
Taux007

liitunud: 27.08.2005




sõnum 28.12.2012 15:07:39 vasta tsitaadiga

tsitaat:
// Konto ründamise funktsioon. Sisendiks on eelmise funktsiooniga loodud BankAccount tüüpi muutuja.

Mis too "BankAccount tüüpi muutuja" tähendada võib?
Kommentaarid: 47 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 46
tagasi üles
vaata kasutaja infot saada privaatsõnum
infidel
HV kasutaja
infidel

liitunud: 31.01.2004




sõnum 28.12.2012 15:09:39 vasta tsitaadiga

See on see esimeses funktsioonis loodud muutuja, alammuutujatega .lastname ja .balance.
Kommentaarid: 36 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 35
tagasi üles
vaata kasutaja infot saada privaatsõnum
Taux007
HV veteran
Taux007

liitunud: 27.08.2005




sõnum 28.12.2012 15:17:27 vasta tsitaadiga

Ikka pisut segane.

Esimeses funktsioonis BankAccount loetakse sisse perekonnanimi ja selle abil vastavalt väärtustatakse üldiseks kasutamiseks this.name ja this.balance. AttackBalance puhul loetakse sisse mingisugune muutuja account, ent kuidas või mille abil on see seotud nüüd meie Jonesiga? Või kus peaks toimuma väärtustamine, et account = "Jones"? (Nagu aru saan, siis peale seda väärtustamist saadakse ka juurde this.balance'le, mis võimaldab muutmist).
Kommentaarid: 47 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 46
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 28.12.2012 15:41:11 vasta tsitaadiga

Javascriptis on kõik asjad objektid.
Funktsioon BankAccount tagastab objekti, millel on 2 muutujat määratud.
Kui sa määrad muutuja jonesBankAccounti väärtuseks funktsiooni BankAccount kutsungi, määratakse selle sisuks funktsiooni tagastatud objekt.

funktsioonile attackBalance annad sa objekti, mille nimi funktsiooni sees on lihtsalt "account", et funktsioon saaks abstraktne olla. Nii saab sama funktsiooni kasutada ka teiste isikute kontode jaoks.
Väärtustamine toimub siin:
attackBalance(jonesBankAccount);
siin kutsutakse välja funktsioon attackBalance ja antakse esimese parameetrina kaasa muutuja jonesBankAccount.


viimati muutis mikk36 28.12.2012 15:42:09, muudetud 1 kord
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
infidel
HV kasutaja
infidel

liitunud: 31.01.2004




sõnum 28.12.2012 15:41:19 vasta tsitaadiga

BankAccount on nagu eelmises ülesandes Company.
Igaks juhuks märgin, et funktsioone ei käivitata mitte kirjutamise järjekorras, vaid vastavalt sellele, kuidas neid koodis esile kutsutakse.

Kui kood ümber paigutada vastavalt käivitamise järjekorrale, on tulemus selline.


var jonesBankAccount = new BankAccount ("Jones"); //Defineeritakse BankAccount, mille puhul nimi on Jones.
//Kuna sisseehitatud muutujatüüpi selle nimega pole, otsib kompilaator vastava nimega funktsiooni
function BankAccount( lastname ) { //Käivitub funktsioon, mis loob muutuja vastavate alamelementidega
    this.lastname = lastname;
    this.balance = 1000000;   
}
//sellel hetkel on olemas muutuja jonesBankAccount, kus jonesBankAccount.lastname = "Jones" ja jonesBankAccount.balance = 1000000

console.log("jonesBankAccount has " + jonesBankAccount.balance + " dollars!");

attackBalance(jonesBankAccount); //Kutsutakse välja funktsioon attackBalance, mille sisendiks on eelnevalt defineeritud konto. Pöördutakse muutuja nime, mitte väärtuse järgi.

function attackBalance(account){ //sisendparameetrina account on antud eelnevalt loodud jonesBankAccount
   account.balance  = 5; //et account = jonesBankAccount, võib seda rida lugeda kui jonesBankAccount.balance = 5;
}

console.log("After attack, jonesBankAccount has " + jonesBankAccount.balance + " dollars!");

Ehk sai veidi selgem.
Kommentaarid: 36 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 35
tagasi üles
vaata kasutaja infot saada privaatsõnum
Taux007
HV veteran
Taux007

liitunud: 27.08.2005




sõnum 28.12.2012 16:01:20 vasta tsitaadiga

mikk36, infidel, super. Sai selgemaks küll. thumbs_up.gif

Eks mul senimaani jäi vist mõte toppama ja välja aitasid need märksõnad:
tsitaat:

Igaks juhuks märgin, et funktsioone ei käivitata mitte kirjutamise järjekorras, vaid vastavalt sellele, kuidas neid koodis esile kutsutakse

tsitaat:

Väärtustamine toimub siin:
attackBalance(jonesBankAccount);
siin kutsutakse välja funktsioon attackBalance ja antakse esimese parameetrina kaasa muutuja jonesBankAccount.
Kommentaarid: 47 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 46
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 28.12.2012 17:35:30 vasta tsitaadiga

Korrektne oleks öelda, et koodi käivitatakse kirjutamise järjekorras, aga koodis saab pöörduda objektide poole, mis on ka varem defineeritud juba. Hiljem defineeritavatele objektidele ei saa ligi pöörduda.
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
Taux007
HV veteran
Taux007

liitunud: 27.08.2005




sõnum 28.12.2012 18:46:32 vasta tsitaadiga

Ühesõnaga on oluline võimalikult palju funktsioone (klass vist isegi öeldakse?) ära kirjutada ning alles siis teha "välja kutsumised"?
Kommentaarid: 47 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 46
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 28.12.2012 19:47:50 vasta tsitaadiga

Taux007, just. Hea viis on selleks näiteks eri failidesse jagamine, saad suure portsu koodi välja viia failist, kus reaalsed väljakutsumised toimuvad ja sellega paremini organiseerida koodi.
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
gandalf
HV kasutaja
gandalf

liitunud: 01.09.2002




sõnum 30.12.2012 18:25:58 vasta tsitaadiga

mikk36 kirjutas:
Hiljem defineeritavatele objektidele ei saa ligi pöörduda.


kui funktsioon deklareerida niimoodi:
function funktsiooniNimi() {}

siis saab teda välja kutsuda ka enne deklaratsiooni ennast. alternatiivsed meetodid funktsiooni loomiseks on avaldisena, mis muutujale omistatakse, või Function konstruktoriga. vt viidatud MDN artiklit.

http://jsfiddle.net/dm69t/ - esimene väljakutse toimib, aga teise rea juures surrakse maha, kui teine rida välja kommenteerida, jookseb ilusti lõpuni.

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope#Function_constructor_vs._function_declaration_vs._function_expression
Kommentaarid: 1 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 30.12.2012 18:39:51 vasta tsitaadiga

gandalf, thumbs_up.gif
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
Taux007
HV veteran
Taux007

liitunud: 27.08.2005




sõnum 30.12.2012 19:41:14 vasta tsitaadiga

Nii, järgmine probleem:
function growBeanstalk(years) {
  // Base case
  if (years <= 2) {
    return 1;
  }   
  // Recursive case
  return growBeanstalk(years - 1) + growBeanstalk(years - 2);   
}

var height = growBeanstalk(33);

console.log(height);

Kui growBeanstalk saab väärtuseks 33, siis minu loogika ütleks, et vastus on 32 + 31 = 63. Aga et ta kutsub kogu aeg uuesti growBeanstalki välja, kas siis ta suudab kuidagi meelde jätta eelmise väärtuse ning selle liita uuele otsa?
Kommentaarid: 47 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 46
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 30.12.2012 20:02:50 vasta tsitaadiga

Taux007,

growBeanstalk(33) ->
growBeanstalk(32) + growBeanstalk(31) ->
(growBeanstalk(31) + growBeanstalk(30)) + (growBeanstalk(30) + growBeanstalk(29)) ->
...


Jne kuni iga funktsioon tagastab väärtus 1'e ehk kuni aasta on iga kutsungi sees 2.
Lihtsam ja kiirem näide:
growBeanstalk(4) ->
growBeanstalk(3) + growBeanstalk(2) ->
(growBeanstalk(2) + growBeanstalk(1)) + growBeanstalk(2) ->
(1 + 1) + 1 = 3


viimati muutis mikk36 30.12.2012 20:06:28, muudetud 1 kord
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
Taux007
HV veteran
Taux007

liitunud: 27.08.2005




sõnum 30.12.2012 20:05:19 vasta tsitaadiga

Liiga kiiresti tormasin siia muret kurtma. Järgmises ülesandes võeti asi juppideks:
1. growBeanstalk(5) {
    return growBeanstalk(4) + growBeanstalk(3);
2.   growBeanstalk(4) {
      return growBeanstalk(3) + growBeanstalk(2);
3.     growBeanstalk(3) {
        return growBeanstalk(2) + growBeanstalk(1);
4.       growBeanstalk(2) {
          return 1;
         };
5.       growBeanstalk(1) {
          return 1;
         };
        return 2; // (1 + 1)
       };
6.     growBeanstalk(2) {
        return 1;
       };
     return 3; // (2 + 1)
    };
7.  growBeanstalk(3) {
     return growBeanstalk(2) + growBeanstalk(1);
8.     growBeanstalk(2) {
        return 1;
       };
9.     growBeanstalk(1) {
        return 1;
       };
     return 2; // (1 + 1)
    };
   return 5; // (3 + 2)
  };
Kommentaarid: 47 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 46
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Javascript - koodi lahtimõtestamine mine lehele 1, 2  järgmine
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.