Visualizzazione dei risultati da 1 a 10 su 14

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    218
    Prima di tutto ringrazio aika per le risposte.
    Nel codice che inserisco ora, invece di tempo1 e tempo(), per evitare confusioni, ho inserito gli identificatori cronometro e muove() e uso l'indentazione che avevo tolto per accorciare il programma e vederlo meglio in una schermata.
    Funziona perfettamente perché ho commentato le righe
    // function avvia() {
    // }
    Ma se si toglie il commento alle due righe, la funzione muove() diventa interna alla funzione avvia() e, non so perché, non viene riconosciuta e dà l'errore "muovi is not a function".
    E' da notare che, nel secondo programma che ho inserito precedentemente, la funzione muove(), che è interna ad avvia(), è riconosciuta ed eseguita correttamente.

    Il motivo del malfunzionamento non è quindi la confusione di identificatori. Ringraziando ancora per l'aiuto spero di trovare il motivo del malfunzionamento


    lanvoel

    codice:
    <!doctype html>
    <html>
    <body>
    <canvas id="myCanvas" width"300" height="200" style="border:1px solid red; background:cyan";></canvas>
    <br>
    <input type="button" value="avvia1" onclick="avvia()">
    <input type="button" value="ferma" onclick="ferma()">
    <script>
    var cronometro;
    var x=1;
    var y=1;
    dx=1;
    dy=1;
    var c=document.getElementById("myCanvas");
    var ctx=c.getContext("2d");
    
    
    //function avvia() {
          cronometro=window.setInterval("muove()",10);
    function muove() {
       ctx.clearRect(0,0,myCanvas.width, myCanvas.height);
       if(dx==1) {
       x++;
       if(x>=280) {dx=-1}
       }
       if(dx==-1){
       x--;
       if(x<=0) {dx=1}
       }
       if(dy==1) {
       y++;
       if(y>=180) {dy=-1}
       }
       if(dy==-1){
       y--;
       if(y<=0) {dy=1}
       }
    ctx.beginPath()
    ctx.strokeStyle="red";
    ctx.lineWidth=4;
    ctx.fillStyle="blue"
    ctx.arc(10+x,10+y,10,0,2*Math.PI);
    ctx.fill();
    ctx.stroke();
    ctx.closePath();
       } 
    //}
    
    
    function ferma() {
    clearInterval(cronometro);
    }
    
    
    </script>
    </body>
    </html

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,482
    Quote Originariamente inviata da lanvoel Visualizza il messaggio
    Ma se si toglie il commento alle due righe, la funzione muove() diventa interna alla funzione avvia() e, non so perché, non viene riconosciuta e dà l'errore "muovi is not a function".
    [...]
    Stai passando a setInterval() una stringa che contiene un pezzo di codice dove viene chiamata la funzione muove(), che quando verrà eseguita non esisterà più, dato che l'esecuzione sarà posticipata di un certo lasso di tempo trascorso il quale ci si troverà già al di fuori della funzione che la definisce, ovvero fuori da avvia().

    A parte che continuo a non comprende il motivo per cui si vuole obbligatoriamente definire quella funzione dentro l'altra, visto che non è una strada obbligata e mi sfuggono i vantaggi nel farlo, ma l'unico modo per far "sopravvivere" la funzione anche all'esterno di avvia() è sfruttare il meccanismo della Closure.

    Ad esempio, si può scrivere il codice in questo modo:
    codice:
    cronometro = window.setInterval(muove, 10);
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.