javascript - setTimeout() iz objekta
imam kod otprilike ove strukture:
Kôd:
function Objekt()
{
this.funkcija1 = funkcija1;
this.funkcija2 = funkcija2;
this.nesto = "bla";
.
.
.
function funkcija1(){
.
.
.
this.funkcija2();
}
function funkcija2(){
.
.
.
setTimeout("this.funkcija2()" , 10);
}
}
var Instanca = new Objekt();
this.funkcija2() kao argument setTimeout-a ne radi. ako unutra napisem Instanca.funkcija2() tad radi. cini li mi se ili je ovo malo blesavo? (iz funkcije1, poziv this.funkcija2(); radi)
|
noviKorisnik |
08. 11. 2007. 21:47 |
The 'this' problem
Ako napišeš 'setTimeout("this.funkcija2()" , 10);' to odlaže evaluaciju string izraza za 10 ms, kada se this iz stringa pridružuje window objektu.
|
ivanhoe |
09. 11. 2007. 00:50 |
ovo je klasican problem sa this... ovo mozes da resis sa closure-om:
Kôd:
function funkcija2(){
var self = this;
var closure = function(){ self.funkcija1(); };
this.timer = window.setTimeout(closure, 10);
}
|
znaci, ako ispravno shvacam, point je uzeti 'onaj this' koji je unutar funkcije (a ne unutar npr. setTimeout/addEventListener argument liste) i staviti u closure jer ce tad bit vezan za konkretan objekt umjesto uz window? right?
|
noviKorisnik |
09. 11. 2007. 15:14 |
Izgleda da može i jednostavnije, jer je prvi argument u setTimeoutu ili string za evaluaciju (koja se vrši pri isteku čekanja) ili referenca na funkciju (koja postoji u trenutku zadavanja tajmauta), pa ako proslediš referencu na funkciju nema frke - evo test -
Kôd:
funkcija2 = function () {
alert ('ovaj nam ne treba ovaj put, sorry');
}
objekat = {
funkcija1: function () {
setTimeout (this.funkcija2, 10);
},
funkcija2: function () {
alert ('uspeo poziv, bravo');
}
}
objekat.funkcija1 ();
Znači, samo referenca umesto stringa.
|
LiquidBrain |
09. 11. 2007. 15:17 |
Ovaj javascript je postao preterano ruzan...
|
ivanhoe |
09. 11. 2007. 15:50 |
ovo je klasican javascript, samo se malo stil pisanja koda promenio... umesto objekat.prototype.neka_funkcija sad je uobicajeno da se koristi notacija kao za asocijativni niz
|
LiquidBrain |
09. 11. 2007. 15:56 |
Off Topic:
Ma znam da je klasican js, samo sam konstatovao na glas... zasto ljudi vishe ne koriste:
Kôd:
move ax,0xFFFFFFFF;
cmp al, 0;
jne nije_isto;
mnogo je jednostavnije bilo... sada se nekako sve zakomplikovalo... Long Live Assembly
:P
|
bluesman |
09. 11. 2007. 16:05 |
Off Topic:
Citat:
Originalno napisao LiquidBrain
(Napišite 46445)
Ovaj javascript je postao preterano ruzan...
|
Zato što ga preterano komplikuju :) Osim xmlHttprequest, javascript je skoro isti kao 1996 godine... tada nije bilo fensi prototype... Prave od toga ono što on nije, ali to je neka druga priča... da ne kvarimo temu.
|
Citat:
Originalno napisao noviKorisnik
(Napišite 46444)
Izgleda da može i jednostavnije, jer je prvi argument u setTimeoutu ili string za evaluaciju (koja se vrši pri isteku čekanja) ili referenca na funkciju (koja postoji u trenutku zadavanja tajmauta), pa ako proslediš referencu na funkciju nema frke - evo test -
Kôd:
funkcija2 = function () {
alert ('ovaj nam ne treba ovaj put, sorry');
}
objekat = {
funkcija1: function () {
setTimeout (this.funkcija2, 10);
},
funkcija2: function () {
alert ('uspeo poziv, bravo');
}
}
objekat.funkcija1 ();
Znači, samo referenca umesto stringa.
|
ali izgleda da rekurzija ne radi.... naime, setTimeout (this.funkcija2, 10); unutar objekt.funkcija2 opet vraca globalnu funkciju2
|
noviKorisnik |
09. 11. 2007. 19:55 |
Aha, tek sad vidim gore da si pokušavao rekurzivni poziv... U tom slučaju:
Kôd:
setTimeout (arguments.callee, 10);
|
(odakle ih samo cupas? :D )
puno ti hvala
|
noviKorisnik |
10. 11. 2007. 00:29 |
Ali, opet gubiš referencu na vlasnika funkcije. Ako ti to nije neophodno, super. Inače, bilo bi korisno sledeće...
... da se referenca na vlasnika prosledi kao parametar, jednostavno...
Kôd:
objekat.funkcija1 = function () {
var funkcija2 = function (vlasnik) {
//sad umesto "this" se koristi "vlasnik"
setTimeout (arguments.callee, 10, vlasnik);
}
funkcija2 (this);
}
... bilo bi korisno da ovu sintaksu podržava i IE, ali jok :-) ... tako da bi ipak morala da radi fora sa closureom.
Kôd:
objekat.funkcija1 = function () {
var vlasnik = this;
var funkcija2 = function () {
//sad umesto "this" se koristi "vlasnik"
setTimeout (arguments.callee, 10);
}
funkcija2 ();
}
Interesanto mi je što je ivanhoe koristio u svom primeru "self" koji je inače sinonim za window objekt, ali ga lokalna deklaracija promenljive čuva u okruženju funkcije i zato ovo funkcioniše.
Off Topic: sorry što sam se raspisao, no kontam da bolje da pišem ovde no da blogujem :-)
|
ivanhoe |
10. 11. 2007. 02:13 |
Citat:
Originalno napisao noviKorisnik
(Napišite 46480)
Interesanto mi je što je ivanhoe koristio u svom primeru "self" koji je inače sinonim za window objekt, ali ga lokalna deklaracija promenljive čuva u okruženju funkcije i zato ovo funkcioniše.
|
ja iskreno nisam imao pojma da je self rezervisana rec u JS-u ?!
To je cisto onako iz navike iz nekih drugih OO jezika gde se koristi self umesto this, nema neke dodatne simbolike, mogao sam i pera da napisem, ali kao self je ociglednije... :)
|
noviKorisnik |
10. 11. 2007. 11:55 |
Ups, pa nije rezervisana reč, ne rekoh to ;-) ... da je rezervisana reč - ona deklaracija bi generisala grešku.
|
Vreme je GMT +2. Trenutno vreme je 20:39. |
|
Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.
Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.