Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    scope e funzioni auto avviate

    Ciao,
    mi manca dove trovare documentazione sulla sequenza di priorità che avviene quando si usano le funzioni autoavviate. Nel prossimo codice ho istanziato una variabile prima di una funzione che si autoavvia, quello che mi aspettavo era che al suo interno la variabile istanziata fosse valorizzata e invece no.

    Qualcuno mi mette ordine sul concetto?

    esempio:

    codice:
    var a=1;
    (function(){
    console.log("prima",a);
        var a=2;
    console.log("dopo",a);
    })();
    console.log("fuori",a);
    ecco cosa mostra la console.

    prima undefined
    dopo 2
    fuori 1
    Luca Bottoni's World
    www.bottonisworld.com

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Ciao, il problema prescinde dal fatto che sia una funzione auto-eseguibile, ma parliamo in generale di scope.
    Quello che influisce è l'aver dichiarato la variabile dentro la funzione.
    Quando dichiari una qualsiasi variabile (con il costrutto var), questa è "valutata" fin dall'inizio dello scope in cui è dichiarata.

    Qui la documentazione:

    https://msdn.microsoft.com/library/b...code-snippet-2
    In JavaScript, variables are evaluated as if they were declared at the beginning of the scope they exist in. Sometimes this results in unexpected behavior, as shown here.
    http://www.w3schools.com/js/js_scope.asp
    Local variables are created when a function starts, and deleted when the function is completed.
    Il valore undefined è quindi giustificato.

    In alternativa, per ottenere ciò che ti saresti aspettato, puoi passare la variabile globale come argomento della funzione, in modo che mantenga il suo valore iniziale prima che lo stesso nome-variabile sia usato per definire localmente la nuova variabile:
    codice:
    var a=1;
    (function(a){
    console.log("prima",a); // output: "prima" 1
        var a=2;
    console.log("dopo",a); // output: "dopo" 2
    })(a);
    console.log("fuori",a); // output: "fuori" 1
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  3. #3
    Grazie Killer,
    mi è chiaro e definito ora, ma mi sfugge il ragionamento che viene fatto sulle variabili all'interno di un contesto che se non diachiarate in precedenza e assegnate a un valore diventano automaticamente globali. Per logica avrei detto automaticamente locali.

    esempio
    Luca Bottoni's World
    www.bottonisworld.com

  4. #4
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    In JavaScript le variabili possono essere dichiarate in modo esplicito usando il costrutto var. Tuttavia, quando l'interprete JavaScript trova una qualsiasi variabile non dichiarata, alla quale è assegnato un qualche valore, questa sarà dichiarata implicitamente, cioè in modo automatico, come variabile globale. In altre parole diventa una proprietà dell'oggetto globale (vedi https://developer.mozilla.org/en-US/...Statements/var).

    Ciò che posso consigliarti è di prendere semplicemente per buono questo fatto. Posso solo pensare che sia stata una scelta della struttura logica nello sviluppo di tale linguaggio.

    Un interessante articolo: http://blog.niftysnippets.org/2008/0...t-globals.html

    Da notare che col nuovo standard ECMAScript 5 è stato introdotto lo Strict Mode per il quale è possibile usare la direttiva "use strict"; che sostanzialmente induce lo sviluppatore ad usare delle regole più rigorose nella stesura dello script ed ottenere quindi un migliore controllo durante lo sviluppo.

    Resta comunque chiaro che l'uso di variabili non dichiarate, in qualunque caso, è una pratica di cattiva programmazione, proprio perché può generare risultati inaspettati (come per il tuo esempio) e rendere difficile l'eventuale debugging. Proprio per tale motivo è sempre consigliato dichiarare tutte le variabili e, nello specifico, dichiararle all'inizio dello script o della funzione di appartenenza. Per approfondire meglio puoi cercare qualche documentazione riguardo hoisting.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

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 © 2025 vBulletin Solutions, Inc. All rights reserved.