|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2056
|
javascript e funzioni
ciao,
sono sempre io , siccome devo imparare html,css,javascript,php per una materia mi sto togliendo i dubbi più grossi che ho grazie a voi. Ora sono qui con un dubbio sulle funzioni in javascript . creo un "oggetto" macchina : Codice:
funtion macchina(modello,colore) { this.modello=modello; this.colore=colore; } Codice:
function prova() { ... } funtion macchina(modello,colore) { this.modello=modello; this.colore=colore; this.motore=prova(); } Codice:
macchina.prototype.motore= function() { .... } giusto ? ma quali sono le differenze tra i due metodi ??? perchè sui libri avevo letto il primo metodo, poi nelle applicazioni pratiche mi sono ritrovato il secondo senza alcuna spiegazione ![]() un altra domanda è invece quanda usare Function() e come , var gestore = new Function("funzione(this,'click')"); gestore cosa è alla fine ? un altra cosa che ho poco capito e che ogni tanto mi crea dubbi è la differenza tra doppi apici e singolo apice in javascript . ![]() mi scuso per le millemila domande , ma qui mi sembra che mi spieghino le cose all'incontrario.. Ultima modifica di aeroxr1 : 30-04-2013 alle 16:11. |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Jul 2009
Messaggi: 146
|
Sono anche io agli inizi ma provo a risponderti per quello che ho capito .
Credo che la differenza tra scrivere il metodo direttamente nell'oggeto o usare il metodo prototype sia puramante grammaticale, non cambia niente . Anche se ad esempio, ad un certo punto del mio programma, mi accorgo che mi servirebbe un metodo che non avevo definito nell'oggeto, allora posso usare prototype senza andare a modificare l'oggetto stesso ed avere il metodo a disposizione. Tra apici e doppi apici anche qui non cambia niente anche se potrebbe tornare utile nella creazione di stringhe : Codice:
"Siamo nell'anno 2013." Per quanto riguarda Codice:
var gestore = new Function("funzione(this,'click')"); |
![]() |
![]() |
![]() |
#3 | |
Member
Iscritto dal: Jul 2009
Città: Milano
Messaggi: 270
|
Quote:
Codice:
funtion macchina(modello,colore) { this.modello=modello; this.colore=colore; this.motore=prova; } Comunque fra i due codici c'è una grande differenza: nel primo caso ogni oggetto creato con il costruttore macchina avrà la propria funzione motore. La funzione è propria dell'oggetto ed il lookup di tale metodo si ferma al livello dell'oggetto. Nel secondo caso stiamo aggiungendo una funzione all'oggetto prototipo di macchina, e dunque quel metodo è condiviso da tutti gli oggetti sono creati con il costruttore macchina. In fase di lookup di tale metodo, la catena sarà risalita fino all'oggetto prototipo (prototype) di macchina. Il secondo metodo (quello di assegnare i metodi al prototipo) è più efficiente e maggiormente usato. Il primo caso è utile, invece, quando il metodo e personalizzato per ogni oggetto che viene creato, che io sappia. Non ci dovrebbe essere differenza fra singoli e doppi apici in JS. Per la risposta all'ultima domanda ti invito a leggere https://developer.mozilla.org/en-US/...jects/Function
__________________
AMD PII x4 955 BE | Sapphire HD4850 Vapor-X 1 GB | Samsung SpinPoint F1 500GB | Samsung EcoGreen F4 2TB Gigabyte GA-MA790FXT-UD5P | Fractal Design Define R3 USB3.0 Titanium Grey | CORSAIR 650W CMPSU-650TX Noctua U12P SE2 | 2 x 2GB Kingston 1333 MHz | Samsung SyncMaster P2450 | Samsung SyncMaster T200 |
|
![]() |
![]() |
![]() |
#4 | ||
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2056
|
Innanzitutto Grazie a entrambi
![]() Quote:
![]() Quote:
![]() non capisco il risparmio di memoria dove sia , ho letto sul libro e dice che con il secondo metodo si risparmia memoria poichè tutte le istanze della classe ereditano i medesimi metodi , che non vengono quindi duplicati per ogni oggetto ![]() ![]() ![]() Non capisco questa definizione, se io creo tre oggetti macchina tutti e tre gli oggetti macchina non hanno ereditato la funzione motore che ho definito nel secondo modo e quindi l'occupazione di memoria non dovrebbe esser uguale al primo metodo ? ![]() facendo un esercizio di laboratorio in cui dovevo creare questa pagina html con i relativi gestori javascript mi sono imbattuto nuovamente nell'uso di Function http://tweb.ing.unipi.it/book/exe/laboratori/1.4/ Codice:
// marge.js // La funzione 'dettaglia' aggiunge i dettagli di un evento // all'elemento area di testo "area_testo" presente nel form // "mio_form". Viene invocata da vari gestori evento. function dettaglia(elemento, evento) { var t = elemento.form.area_testo; var nome_elemento = elemento.name; var valore = " "; if ((elemento.type == "select-one") || (elemento.type == "select-multiple")){ for(var i = 0; i < elemento.options.length; i++) if (elemento.options[i].selected) valore += elemento.options[i].value + " "; } else if (elemento.type == "textarea") valore = "..."; else valore = elemento.value; var mess = evento + ": " + nome_elemento + ' (' + valore + ')\n'; t.value += mess; } // La funzione aggiungi_gestori installa un insieme di gestori di eventi su // ogni elemento di un form f, senza controllare se l'elemento supporta // tutti questi tipi di eventi function aggiungi_gestori(f) { var gestore_click = new Function("dettaglia(this, 'Click')"); var gestore_change = new Function("dettaglia(this, 'Change')"); var gestore_focus = new Function("dettaglia(this, 'Focus')"); var gestore_blur = new Function("dettaglia(this, 'Blur')"); var gestore_select = new Function("dettaglia(this, 'Select')"); var gestore_dblclick = new Function("dettaglia(this, 'dblClick')"); for(var i = 0; i < f.elements.length; i++) { var e = f.elements[i]; e.onclick = gestore_click; e.onchange = gestore_change; e.onfocus = gestore_focus; e.onblur = gestore_blur; e.onselect = gestore_select; e.ondblclick = gestore_dblclick; } // Gestori speciali per i bottoni: f.bottone_svuota.onclick = new Function("this.form.area_testo.value=''; dettaglia(this, 'Click');"); f.bottone_sottometti.onclick = new Function("dettaglia(this, 'Click'); return false"); f.bottone_azzera.onclick = new Function("this.form.reset(); dettaglia(this, 'Click'); return false"); } // Attiviamo il form aggiungendo i possibili gestori aggiungi_gestori(document.mio_form); 1) se all'interno del for evidenziato facevo direttamente Codice:
e.onclick=dettaglia(this, 'Click'); presumo che la soluzione a questa domanda sia nella pagina da voi linkata : Codice:
Note: Functions created with the Function constructor do not create closures to their creation contexts; they always run in the window context (unless the function body starts with a "use strict"; statement, in which case the context is undefined). 2) il this , usato nell'ultima parte evidenziata non dovrebbe puntare all'oggetto cliccato ? quindi il bottone svuota del form f ? a vedere dal codice non funziona esattamente cosi ![]() Ultima modifica di aeroxr1 : 02-05-2013 alle 12:51. |
||
![]() |
![]() |
![]() |
#5 | ||||
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2776
|
Quote:
Quote:
Codice:
e.onclick=function(){this.form.area_testo.value=''; dettaglia(this, 'Click')}; Codice:
Every function in JavaScript is actually a Function object. Quote:
![]() Quote:
Edit: in effetti il codice non sembra corretto, se funziona significa che ho sbagliato qualcosa nella spiegazione ![]() Ultima modifica di wingman87 : 03-05-2013 alle 20:53. |
||||
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Ciao,
posto solo per consigliare questa risorsa all'utente aeroxr1, se leggi l'inglese ti chiarirà la questione: http://superherojs.com/#language in particolare il punto 4: http://msdn.microsoft.com/en-us/magazine/ff852808.aspx
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
#7 | |||
Senior Member
Iscritto dal: Aug 2003
Città: Barletta (BA)
Messaggi: 939
|
Quote:
Quote:
Quote:
__________________
In a world without fences, who needs Gates? Power by: Fedora 8 - Mac OS X 10.4.11 Ultima modifica di nico159 : 07-05-2013 alle 09:54. |
|||
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2056
|
Quote:
![]() Grazie mi avete fatto capire cosa è il prototype ![]() Comunque il this in quel caso non si riferisce al bottone premuto ? e quindi alla proprietà form del bottone premuto ? ![]() ![]() ![]() http://tweb.ing.unipi.it/book/exe/laboratori/1.4/ ma sembra funzionare quindi... ---------------------- Ora ho un altro paio di domandine , posso vivere anche con questi dubbi , ma magari se voi sapete che sono mi farebbe piacere togiermeli ![]() quanti modi diversi ci sono per dichiarare una cavolo di funzione ? sono tutti equivalenti ? Codice:
var pippo = new Function ("dettaglia(this, 'Click')") Poi ci sono i seguenti due metodi : Codice:
funtion stampaNome() { .... } Codice:
var stampaNome = function() { ..... } tutti questi metodi per dichiarare le funzioni a parte il metodo con il costruttore Function , sono identici ? restituiscono tutti lo stesso risultato ? in cosa differiscono nell'uso ? posso richiamare stampaNome come una normale funzione in tutti e 2 i casi ? Grazie ancora per le precedenti risposte ![]() Ultima modifica di aeroxr1 : 16-05-2013 alle 15:09. |
|
![]() |
![]() |
![]() |
#9 | |||
Senior Member
Iscritto dal: Jan 2003
Città: Milano - Udine
Messaggi: 9418
|
Quote:
Per quanto riguarda il tuo dubbio: Quote:
Quote:
La prima è un'istruzione, la seconda è un'espressione, ove lo statement (istruzione function) viene associato o se preferisci, meglio, contenuto nella variabile stampaNome. Per usare le parole di Douglas Crockford, cito testualmente: To use the language well, it is important to understand that functions are values. function statements are subject to hoisting. This means that regardless of where a function is placed, it is moved to the top of the scope in which it is defined. This relaxes the requirement that functions should be declared before used, which I think leads to sloppiness. It also prohibits the use of function statements in if statements. It turns out that most browsers allow function statements in if statements, but they vary in how that should be interpreted. That creates portability problems. The first thing in a statement cannot be a function expression because the official grammar assumes that a statement that starts with the word function is a function statement. The workaround is to wrap the function expression in parentheses: Codice:
(function () { var hidden_variable; // This function can have some impact on // the environment, but introduces no new // global variables. })( ); A proposito di prototipi e contesto, è prassi comune utilizzare l'espressione var that = this oppure var self = this in modo da poter catturare, valutare se necessario, l'"istanza" corrente (o meglio oggetto) anche quando this ha già terminato il suo ciclo di vita. Esempio: carichi la pagina con il suo bel scriptino JavaScript, l'oggetto viene creato e termina il suo scope. Un utente scatena un evento (clicca un bottone o altro), a questo punto, viene invocata la funzione di quell'oggetto. "this" non esiste più perché sei già fuori da quel contesto e l'esecuzione arriva in un secondo momento: il "this" a questo punto è una finestra piuttosto che altro. Ecco perché usiamo "that" o "self", come reference all'oggetto che ha determinato la funzione eseguita in seconda battuta. Consiglio spassionato: leggete il libro "The Good Parts" (ma ce ne sono diversi simili) del già citato Douglas Crockford ed i suoi articoli, in particolar modo quelli su convenzione e stile di stesura del codice. ![]() |
|||
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2056
|
grazie di tutto
![]() mi procurerò certamente i libri che mi hai consigliato ![]() stavo un pò facendo dei test , e ho notato un comportamento strano che mi ha mandato un pò in confusione . programmazione attraverso Dom e senza usare il Dom .. Se uso il Dom per accedere agli elementi vuol dire accedere ai nodi e agli elementi della pagina tramite le funzioni getElementById ecc ecc , ma se non volessi usare il dom ? mi serve capirlo , perchè a forsa di fare esercizi sul dom mi è venuto il dubbio se ci sia realmente la differenza tra i due modi di programmazione . Aiuto confusioneeeeeeee ![]() Volevo disabilitare un bottone di id startbutton usando il javascript e ho fatto nella seguente maniera : Codice:
pulsantea=document.getElementById("startbutton"); pulsantea.disabled=false; Codice:
pulsantea.setAttribute("disabled","false"); Ho visto invece che funziona anche nella seguente maniera : Codice:
startbutton.disabled=false; la terza invece sarebbe la maniera di accedere al button senza usare il dom , con il solo utilizzo dell'id giusto ? dato che volevo disabilitare il bottone appena premuto avrei potuto farlo anche con un this ? Ultima modifica di aeroxr1 : 23-05-2013 alle 13:59. |
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Jan 2003
Città: Milano - Udine
Messaggi: 9418
|
Quote:
Stai provando su più browser? Occhio perché il comportamento soprattutto di IE a volte è un po' balengo. Potresti usare questa sintassi: Codice:
document.getElementById("startbutton").disabled = true; Piccola notazione tendenzialmente si usa il camel case per gli Id HTML, nomi funzioni ecc. ![]() Altro consiglio, se vuoi manipolare il DOM, più che attraverso JavaScript (per interventi piccoli ok), ma è forse preferibile andare direttamente di jQuery.... |
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2056
|
Quote:
![]() Comunque per non funziona intendo che proprio non va , non mi setta il valore .. non capisco dove sia il problema , ma il bottore mi rimane sempre disabilitato ![]() Ora cerco onCommand ![]() I metodi per risparmiare memoria in javascript sono il prototype delle funzioni e ? ci sono altri metodi ? ![]() Io adesso stavo facendo un progettino in javascript , ma per ora avevo creato due oggetti , non aventi metodi . Però poichè ci sono delle function che ho scritto che vengono usate più volte , mi conviene ripulire il codice in maniera che vi sia un oggetto che contenga i prototype di queste funzioni spesso utilizzate ? Grazie ancora ![]() Ultima modifica di aeroxr1 : 02-06-2013 alle 06:50. |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2056
|
Quote:
In pratica ho creato un oggetto campo gioco : Codice:
function campogioco () { this.x=x; this.y=y; } Codice:
campogioco.prototype.gestore=function() { } document.onkeydown=recinto.gestore; Codice:
var recinto=new campogioco(100,200); dove sbaglio ? mmm Ultima modifica di aeroxr1 : 07-06-2013 alle 11:23. |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Aug 2003
Città: Barletta (BA)
Messaggi: 939
|
Codice:
document.onkeydown=recinto.gestore; Se vuoi preservare il normale comportamento di gestore devi scrivere il codice così: Codice:
document.onkeydown = function (e) { recinto.gestore(); };
__________________
In a world without fences, who needs Gates? Power by: Fedora 8 - Mac OS X 10.4.11 |
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2056
|
Quote:
perchè nel secondo metodo non cambia il contesto ? uffa sul mio libro di teoria tutte queste cose non sono spiegate.. Codice:
document.onkeydown = function (e) { recinto.gestore(); }; EDIT: ho provato e funziona anche senza ripassarglielo.. come è possibile ? l'evento passa automaticamente e alla funzione handler , e quindi in questo caso non a reconto.gestore().... Sinceramente un altra cosa che ho poco chiara è la differenza tra fare : Codice:
var pippo = function() { } Codice:
function pippo() {} (avete tentato di spiegarmela parecchie volte , ma niente sono duro ![]() Per cercare di capire meglio i contesti ho seguito la guida su html.it , ma questo mi ha rimandato in paranoia , poichè non capisco bene come possa dare il risultato corretto http://www.html.it/pag/18588/isolare...elle-funzioni/ Ultima modifica di aeroxr1 : 07-06-2013 alle 15:22. |
|
![]() |
![]() |
![]() |
#16 | ||
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2776
|
Quote:
Quote:
No, in pippo va il riferimento alla funzione. Direi che la differenza è che nel primo caso la funzione è anonima ed è riferita tramite una variabile, nel secondo no... |
||
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2056
|
Codice:
document.onkeydown = function (e) { recinto.gestore(); }; Codice:
document.onkeydown = function (e) { recinto.gestore(e); }; in linea teorica mi torna di più , invece in pratica torna in entrambi i modi ![]() comunque a suon di provare e riprovare ho capito un pò meglio il this e il contesto ![]() ![]() Un ultima cosa , è possibile ad un click di un bottone non associare una funziona ma far si che al click corrisponda un cambiamento di una variabile ? del tipo : var locale=0; bottone.onclick= (locale =5); |
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2776
|
Quote:
Non puoi farlo senza usare una funzione |
|
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2056
|
sono quasi arrivato a fine progetto e di cose ne ho imparate molte grazie a voi
![]() ho una domanda sul precaricamento delle immagini ![]() ho precaricato tre immagini Codice:
this.coda=new Image(20,20); coda.src="./img/elemento.png"; capo=new Image(20,20); capo.src="./img/testa.png"; topo=new Image(20,20); topo.src="./img/topo.png"; ![]() precedentemente attraverso il dom impostavo la classe di questi div e poi usavo un css esterno riferito a tale classe per modificare lo sfondo, ma cosi facendo ho notato che prima che ogni tanto venivano visualizzati i div senza sfondo fino a che non veniva caricato il rispettivo sfondo in cache. Per risolvere a questo problema avevo pensato invece di impostare gli sfondi di appendere ai vari div un immagine senza impostarla come sfondo (a me va bene tanto non devo mettere altro nel div a parte l'immagine ![]() Che mi dite ? p.s : ho trovato un problema con internet explorer 8... non mi risponde ai comandi il mio caro serpente, Codice:
document.onkeydown=function(e) { that.gestore(e); } campogioco.prototype.gestore=function(e) //gestione della pressione dei tasti { e=(!e) ? window.event : e; var tasto = (e.which != null) ? e.which : e.KeyCode; switch (tasto) ... ![]() Ultima modifica di aeroxr1 : 14-06-2013 alle 01:50. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:13.