Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
Taux007
HV veteran

liitunud: 27.08.2005
|
20.12.2012 08:30:47
Javascript - koodi lahtimõtestamine |
|
|
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 |
|
 |
Sold OUT
no credit

liitunud: 30.07.2002
|
20.12.2012 08:33:19
|
|
|
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 |
|
 |
infidel
HV kasutaja

liitunud: 31.01.2004
|
20.12.2012 10:08:00
|
|
|
Puust ja punaseks, kommentaar iga rea järel:
javascript:
|
var power = function (base, exponent) { // alustatakse funktsioon power (astendamine) defineerimist, sisendiks on kaks parameetrit base, exponent - maakeeli alus ja astendaja var result = 1; // Määratakse väljundi väärtuseks 1 ehk arv astmes 0. 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. 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. } //Tsükli lõpp return result; // Tagastatakse väljund }; //Funktsiooni lõpp power(4, 3); // Funktsiooni toimimise kontroll, mis peaks tagastama 4 astmes 3 ehk 64.
|
|
|
Kommentaarid: 36 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
35 |
|
tagasi üles |
|
 |
Taux007
HV veteran

liitunud: 27.08.2005
|
20.12.2012 10:24:04
|
|
|
infidel, 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 |
|
 |
andris9
HV vaatleja

liitunud: 14.06.2011
|
20.12.2012 17:13:07
|
|
|
Igaks juhuks märgin ära, et javascript sisaldab juba sarnast funktsiooni ja seega ise astendamist korraldama ei pea
Lisaks saab see hakkama ka negatiivsete ja murdarvuliste astmetega, millega eelpoolkirjeldatud funktsioon toime ei tule.
|
|
tagasi üles |
|
 |
Taux007
HV veteran

liitunud: 27.08.2005
|
26.12.2012 02:00:37
|
|
|
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 |
|
 |
infidel
HV kasutaja

liitunud: 31.01.2004
|
28.12.2012 10:18:30
|
|
|
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:
|
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. this.name = name; //tulevase muutuja parameeter nimi saab väärtuse vastavalt sisendile this.year = yearFounded; //sama asutamise aasta kohta this.profits = profitLevel; //ja kasumlikkusega ka var bankBalance = 20; //määratakse tulevase muutuja kontojäägiks 20 this.getBalance = function (){ //luuakse alamfunktsioon kontojäägi näitamiseks, return bankBalance - 2; //mis annab vastuseks kontojääk - 2. }; //alamfunktsioon kinni } //funktsiooni lõpp
|
Sealt edasi - kuidas neid väärtusi kätte saada:
javascript:
|
var Firma = new Company("AS Mida Iganes", "2012", 100); //defineerime uue muutuja console.log(Firma.name); //kõik eelnevalt this abil määratud asjad saab nüüd kätte kujul muutuja.parameeter console.log(Firma.year); console.log(Firma.profits); 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.
|
viimati muutis infidel 28.12.2012 14:02:40, muudetud 1 kord |
|
Kommentaarid: 36 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
35 |
|
tagasi üles |
|
 |
Taux007
HV veteran

liitunud: 27.08.2005
|
28.12.2012 13:30:32
|
|
|
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 |
|
 |
infidel
HV kasutaja

liitunud: 31.01.2004
|
28.12.2012 14:03:27
|
|
|
Näpukas, peab olema console.log(Firma.year);
Parandasin eelmises postituses ära.
|
|
Kommentaarid: 36 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
35 |
|
tagasi üles |
|
 |
Taux007
HV veteran

liitunud: 27.08.2005
|
28.12.2012 14:12:06
|
|
|
Vägev! 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 |
|
 |
infidel
HV kasutaja

liitunud: 31.01.2004
|
28.12.2012 14:28:07
|
|
|
Koodi kommentaarid kergelt muudetult:
javascript:
|
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){ // Konto ründamise funktsioon. Sisendiks on eelmise funktsiooniga loodud BankAccount tüüpi muutuja. account.balance = 5; // Võetakse sisendiks antud BankAccount ja tema .balance saab väärtuse 5. } var jonesBankAccount = new BankAccount ("Jones"); //Uue konto loomine. console.log("jonesBankAccount has " + jonesBankAccount.balance + " dollars!"); //kontoseisu logimine attackBalance(jonesBankAccount); //Rünnak konto vastu. Võrdne sellise reaga: jonesBankAccount.balance = 5; console.log("After attack, jonesBankAccount has " + jonesBankAccount.balance + " dollars!"); //uue seisu logimine
|
|
|
Kommentaarid: 36 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
35 |
|
tagasi üles |
|
 |
Taux007
HV veteran

liitunud: 27.08.2005
|
28.12.2012 15:07:39
|
|
|
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 |
|
 |
infidel
HV kasutaja

liitunud: 31.01.2004
|
28.12.2012 15:09:39
|
|
|
See on see esimeses funktsioonis loodud muutuja, alammuutujatega .lastname ja .balance.
|
|
Kommentaarid: 36 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
35 |
|
tagasi üles |
|
 |
Taux007
HV veteran

liitunud: 27.08.2005
|
28.12.2012 15:17:27
|
|
|
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 |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
28.12.2012 15:41:11
|
|
|
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 |
|
 |
infidel
HV kasutaja

liitunud: 31.01.2004
|
28.12.2012 15:41:19
|
|
|
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 |
|
 |
Taux007
HV veteran

liitunud: 27.08.2005
|
28.12.2012 16:01:20
|
|
|
mikk36, infidel, super. Sai selgemaks küll.
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 |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
28.12.2012 17:35:30
|
|
|
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 |
|
 |
Taux007
HV veteran

liitunud: 27.08.2005
|
28.12.2012 18:46:32
|
|
|
Ü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 |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
28.12.2012 19:47:50
|
|
|
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 |
|
 |
gandalf
HV kasutaja

liitunud: 01.09.2002
|
|
Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
1 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
Taux007
HV veteran

liitunud: 27.08.2005
|
30.12.2012 19:41:14
|
|
|
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 |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
30.12.2012 20:02:50
|
|
|
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 |
|
 |
Taux007
HV veteran

liitunud: 27.08.2005
|
30.12.2012 20:05:19
|
|
|
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 |
|
 |
|