Articles

Cercherei di spiegare l’ambito lessicale in inglese semplice. Augurami buona fortuna

Mentre scrivi un articolo su chiusure e VITA alcuni giorni fa. Stavo cercando di spiegare l’ambito lessicale in un modo breve e semplice. Ho notato che l’articolo stava diventando sempre più grande, quindi ho deciso di scrivere separatamente sull’ambito lessicale.
In questo articolo, vorrei cercare di spiegare le basi della portata lessicale, che cosa significa e dare esempi per aiutarvi a capire come funziona in JavaScript. Niente parole d’ordine…Te lo prometto.

In primo luogo, scomponiamo la parola “Ambito lessicale”.

scope

Parleremo prima di quello facile: scope.
In parole povere, scope può significare:

  • Un confine
  • Una regione
  • Un ambiente

O qualsiasi altro sinonimo a cui potresti pensare.

Ti ricordi di aver visto un tutorial in cui l’istruttore ti dice che una certa idea / argomento è oltre lo scopo del video?
O quando un team di un altro dipartimento sta lavorando a un progetto e dici loro di aggiungere una funzionalità che ritieni interessante e ti dicono: “Questo è oltre lo scopo di questo progetto”.
Beh, penso che si ottiene il succo. Scope è semplicemente una regione in cui qualcosa è permesso di operare in un dato periodo di tempo.

In Informatica, questo potrebbe significare una regione in cui alcuni dati esistono e si può accedere. Questi dati potrebbero essere qualcosa di simile a una variabile.

In un linguaggio come JavaScript, potremmo definire un ambito creando un blocco usando parentesi graffe: {...}. Chiamiamo questo Ambito di blocco. Ciò significa che le variabili dichiarate all’interno di questo blocco sono accessibili solo all’interno di questa regione. Questa regione copre tutto al suo interno, inclusi altri blocchi figlio/interno creati all’interno di quella regione.
In altre parole questa regione è local e le sue variabili non possono essere accessibili direttamente dal mondo esterno. Quindi questo potrebbe essere chiamato un ambito locale.
Le variabili dichiarate all’interno delle funzioni si trovano nell’ambito locale della funzione.

function doSomething() { let name = "john"; console.log(name)}doSomething(); // Prints 'john'// would produce a Reference error// because name is local to doSomething() function's scopeconsole.log(name); 

Ora, potresti aver sentito parlare di Ambito globale prima. Beh, questo è un ambiente che non è racchiuso in un blocco. Ogni codice nel tuo ambiente Javascript ha accesso ad esso. Questo è l’ambiente JavaScript aperto. Quindi il codice qui sotto dovrebbe funzionare.

let name = "john"; // In the global scopefunction doSomething() { name = "James" console.log(name); // The function can access the global scope variable 'name'}doSomething(); // Prints "James"console.log(name); // Can access 'name' too

Una cosa da notare:

Un ambito ha accesso al suo ambito padre ma l’ambito padre non ha accesso diretto alle variabili dichiarate in un ambito interno.

La funzione ha accesso anameperché la funzione è dichiarata nell’ambito globale ename esiste nell’ambito globale. Se il nome è stato dichiarato all’interno della funzione doSomething(), il codice nell’ambito globale non può modificare il valore di name direttamente perché name è locale alla funzione.

Credo che tu abbia una buona comprensione di cosa significhi Scope. Significa semplicemente una regione o un ambiente in cui esiste una variabile e si può accedere o modificare.

Ora, parliamo di “Lessicale”

Lessicale

Per capire lessicale, diamo prima un’occhiata alla parola da cui deriva: Lexicon.
Lessico è stato derivato dalla parola latina: “lexis “che significa”parola”
In inglese semplice:

Lexicon significa semplicemente un dizionario. In parole d’ordine, significa un vocabolario della lingua di una persona. È come un libro in cui sono memorizzati il significato/definizione delle parole.

Ogni volta che vuoi trovare il significato di una parola, vai al lessico.
Non guardi dove viene usata la parola e indovina cosa significa e il suo contenuto o valore. Vai sempre al lessico, dove lo scopo della parola è creato e chiaramente definito.

Ora con quella spiegazione:

Lessicale significa semplicemente qualcosa relativo al lessico. In altre parole, significa qualcosa legato alle parole o al vocabolario della lingua di una persona. Qualcosa legato alla creazione o alla definizione di parole.

Parliamo di ambito lessicale.

Ambito lessicale

Abbiamo visto il significato delle due parole in inglese semplice.
Con questa conoscenza, definiamo l’ambito lessicale in inglese semplice:

L’ambito lessicale significa semplicemente che la regione in cui esiste una parola è determinata dal punto in cui è stata definita o creata.

Altre definizioni sarebbero:

L’ambito lessicale significa che il significato/valore di una parola può essere determinato solo dalla regione / ambiente in cui è stata creata.

Ambito lessicale significa che non si esternalizza direttamente il significato di una parola a persone provenienti da una regione esterna che utilizza la parola. Questo perché lessicale pone l’accento sull’origine su dove è stato creato/definito.

Va bene, darò un esempio.
Usiamo la parola: “Danza”.
La parola “danza” è stato creato/definito in Gran Bretagna. Il popolo britannico conosce il suo significato. Questa parola esiste nello scopo in cui è stata creata: “Gran Bretagna”. Il Galles è in Gran Bretagna, quindi il Galles ha accesso a questa parola (ricorda che abbiamo già spiegato perché sopra). Così il popolo gallese può aggiornare il significato di questa parola per soddisfare il loro dialetto locale. Questo perché sono all’interno della portata della Gran Bretagna.

I tedeschi non possono venire direttamente e cambiare il significato di questa parola. Questo perché la parola non è stata creata in Germania. Quindi, se i tedeschi volessero usare la parola inglese: “danza” e quella parola non è ancora stata creata dalla Gran Bretagna, quella parola non sarebbe disponibile, non importa quanto duramente provino. Questo renderebbe nessuno a conoscere il significato effettivo di quella parola in Germania perché la parola non esiste nel lessico britannico. (Non preoccuparti se questo sembra incomprensibile, spiegherò con il codice più avanti)

Dato che siamo studenti di Scienze e non linguisti, sostituiamo “word” con “variable”.

La nostra nuova definizione sarebbe:

Ambito lessicale significa semplicemente che la regione in cui esiste una variabile è determinata dal punto in cui è stata definita o creata.

Ambito lessicale significa che il significato/valore di una variabile può essere determinato solo dalla regione / ambiente in cui è stata creata.

Ambito lessicale significa che non si esternalizza direttamente il significato di una variabile al codice da una regione esterna(blocco) che utilizza la variabile. Questo perché lessicale pone l’accento sull’origine su dove è stata creata/definita la variabile.

Quindi l’ambito lessicale ci mostra che una variabile può essere utilizzata solo nell’ambito in cui è stata creata e non dove è stata chiamata.

Vediamo come funziona in code:

function rideBritishBoat() { let boatName = "Queen's Dab"; // local variable return `Driving ${boatName}`}function rideGermanBoat() { const status = rideBritishBoat(); return status;}rideGermanBoat();

L’esempio sopra simula uno scenario in cui i tedeschi hanno acquistato una barca dalla Gran Bretagna….(Si potrebbe scambiare che mai paese si want…no ho bisogno di combattere perché non ho menzionato qualche altro paese. Questi sono solo nomi di paesi e non librerie JavaScript😛).
IlrideGermanBoat()utilizza ilrideBritishBoat().
Poiché JavaScript utilizza l’ambito lessicale, quando si esegue la funzione rideBritishBoat(), va dove è stata creata e ottiene il riferimento della variabile: boatName. Quindi, con l’ambito lessicale, ogni volta che viene eseguitorideBritishBoat(), JavaScript entra nell’ambito della funzione per cercare le variabili utilizzate in questa funzione.

Nota: L’ambito della funzionerideBritishBoat() è il suo ambito locale e l’ambito globale. Il rideGermanBoat()non è nell’ambito lessicale della funzione rideBritishBoat()perché rideBritishBoat() non è stato creato al suo interno.

Ora, cambiamo un po ‘ l’esempio:

function rideBritishBoat() { return `Driving ${boatName}`; // Reference Error: boatName not defined}function rideGermanBoat() { let boatName = "Merkel's Dab"; const status = rideBritishBoat(); return status;}rideGermanBoat();

Il codice precedente fallisce. Le funzionirideBritishBoat() non sono precise. Fallisce quando si tenta di accedere a boatName nell’istruzione return.

Perché?

Questo perché JavaScript utilizza l’ambito lessicale.
Come funziona è quando incontra la variabileboatName all’interno della funzionerideBritishBoat(), cerca dove è stata creata la variabileboatName nella sua catena di ambito. Cioè, tutto l’ambito possibile di quella funzione che è: Ambito locale della funzione, quindi controlla il suo ambito di inclusione in questo caso l’ambito globale.

Quindi è così che JavaScript controlla le variabili. Controlla prima il blocco locale in cui viene utilizzata la variabile corrente per sapere se è stata dichiarata lì. Se non lo fosse, allora sale all’ambito che lo racchiude e continua se non trova una dichiarazione finché non raggiunge la parte superiore della catena che è l’ambito globale

C’è un altro tipo di ambito chiamato “Ambito dinamico”.
Il codice precedente funzionerebbe in un linguaggio che supporta l’ambito dinamico(ad esempio Lisp).
Questo perché in un ambiente con ambito dinamico, la variabile viene controllata in fase di esecuzione. Ciò che significa è che quando si esegue rideGermanBoat() e l’esecuzione arriva a rideBritishBoat() l’ambiente di runtime controlla il valore di boatName dove il codice è attualmente in esecuzione. In questo caso lo trova, quindi nessun problema e il codice funziona al previsto e stampa Driving Merkel's Dab.

L’ambito lessicale è anche chiamato Ambito statico perché l’ambito è determinato in fase di compilazione. Significa che il suo ambiente / ambito è fisso e non può semplicemente cambiare. In altre parole, le variabili possono essere chiamate solo dall’interno del blocco di codice in cui è stato dichiarato/creato.

L’ambito dinamico è chiamato dinamico perché il suo ambiente (ambito esterno) può cambiare. In altre parole, le variabili possono essere chiamate dall’esterno del blocco in cui vengono create.

Quindi potremmo avere un’altra funzione che utilizza rideBritishBoat()chiamatorideMauritianBoat():

function rideMauritianBoat() { let boatName = "Flying Dodo's Dab"; const status = rideBritishBoat(); return status;}rideMauritianBoat();

In un linguaggio con ambito dinamico, è possibile vedere il valore di boatName variabile all’interno di rideBritishBoat() dipende dall’ambito in cui viene eseguito. Come possiamo vedere che questo ambito può cambiare, quindi è dinamico.
Quindi all’interno dirideBritishBoat(), chiama la variabileboatName dirideMauritianBoat() che è al di fuori del suo ambito di blocco.

Questo è l’ambito dinamico e l’ambito lessicale è l’opposto.

Ma ricorda, JavaScript non è in ambito dinamico. Questo è solo per mostrare la differenza.

Quindi l’ambito lessicale controlla le variabili in fase di compilazione (le variabili devono essere create e accessibili nell’ambito / blocco utilizzato) mentre l’ambito dinamico controlla le variabili in fase di esecuzione (le variabili potrebbero non essere create nell’ambito durante la compilazione ma possono essere presenti quando la funzione è in esecuzione).

Gli sviluppatori senior sono come: Amico!! JavaScript non è un linguaggio compilato!!
Per favore, Lasciamo che parlare per qualche altro giorno. Cerca solo di ottenere il messaggio che sto passando.
Va bene, sono incazzato in questo momento. Ecco un esercizio per te.

Esercizio rapido

Quale sarebbe l’output di questa funzione?

function rideBritishBoat() { let boatName = "Queen's Dab"; function rideWelshBoat() { boatName = "Welsh Royal Boat"; console.log(boatName) } rideWelshBoat();}rideBritishBoat()

Sommario

Lo scopo di questo articolo era quello di spiegare l’ambito lessicale in modo semplice utilizzando la grammatica di base e brevi esempi. Se hai notato alcune parole sono in grassetto. Queste sono le parole chiave per capire questo concetto. Inoltre, ho molte definizioni alternative degli stessi concetti. Questo è stato fatto per voi per selezionare quale affonda facilmente per voi. Tratti diversi per persone diverse

Da quello che abbiamo imparato sopra possiamo dire che:

  • Un ambito è un ambiente/regione in cui esiste qualcosa (una variabile)
  • Un ambito può accedere ai suoi genitori.
  • Un ambito padre non ha accesso diretto alle variabili dichiarate in un ambito interno.
  • Lessicale ha a che fare con dove una variabile è stata dichiarata / creata.
  • L’ambito lessicale impone la ricerca di variabili dall’ambito/blocco in cui sono state create / dichiarate e non dall’ambiente in cui sono in esecuzione.
  • L’ambito dinamico è l’opposto dell’ambito lessicale.
  • Lo scoping dinamico controlla le variabili da dove sono in esecuzione.

Grazie per la lettura.
Ci vediamo nel prossimo post.