meaning - javascript tutorial




Qual è lo scopo della parola chiave var e quando dovrei usarlo(o ometterlo)? (12)

Non usare var !

var era il modo pre-ES6 per dichiarare una variabile. Ora siamo nel futuro e dovresti essere codificato come tale.

Usa const e let

const dovrebbe essere usato per il 95% dei casi. Rende così la variabile reference non può cambiare, quindi array, object e proprietà del nodo DOM possono cambiare e dovrebbe essere const .

dovrebbe essere usato per qualsiasi variabile che si aspetta di essere riassegnata. Questo include all'interno di un ciclo for. Se scrivi mai varName = oltre l'inizializzazione, usa let .

Entrambi hanno un ambito a livello di blocco, come previsto nella maggior parte delle altre lingue.

NOTA : questa domanda è stata posta dal punto di vista di ECMAScript versione 3 o 5. Le risposte potrebbero non essere aggiornate con l'introduzione di nuove funzionalità nel rilascio di ECMAScript 6.

Qual è esattamente la funzione della parola chiave var in JavaScript e qual è la differenza tra

var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;

e

someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;

?

Quando useresti uno dei due, e perché / cosa fa?


È necessario utilizzare la parola chiave var a meno che non si intenda associare la variabile all'oggetto window nel browser. Ecco un link che spiega l'ambito e la differenza tra l'ambito glocale e l'ambito locale con e senza parola chiave var.

Quando le variabili vengono definite senza l'uso della parola chiave var, ciò che appare è una semplice operazione di "assegnazione".

Quando il valore è assegnato a una variabile in javascript, l'interprete cerca prima di trovare la "dichiarazione di variabile" nello stesso contesto / ambito di quella di assegnazione. Quando l'interprete esegue dummyVariable = 20 , cerca la dichiarazione di dummyVariable all'inizio della funzione. (Poiché tutte le dichiarazioni delle variabili vengono spostate all'inizio del contesto dall'interprete javascript e questo è chiamato sollevamento)

Potresti anche voler vedere il sollevamento in javascript


All'interno di un codice, se si utilizza una variabile senza utilizzare var, allora ciò che accade è automaticamente var var_name viene inserito nello scope globale ad esempio:

someFunction() {
    var a = some_value; /*a has local scope and it cannot be accessed when this
    function is not active*/
    b = a; /*here it places "var b" at top of script i.e. gives b global scope or
    uses already defined global variable b */
}

Come qualcuno sta cercando di imparare questo è come lo vedo io. Gli esempi precedenti erano forse un po 'troppo complicati per un principiante.

Se si esegue questo codice:

var local = true;
var global = true;


function test(){
  var local = false;
  var global = false;
  console.log(local)
  console.log(global)
}

test();

console.log(local);
console.log(global);

L'output sarà: falso, falso, vero, vero

Perché vede le variabili nella funzione come separate da quelle al di fuori, quindi il termine variabile locale e questo perché abbiamo usato var nel compito. Se togli la var nella funzione così ora si legge così:

var local = true;
var global = true;


function test(){
  local = false;
  global = false;
  console.log(local)
  console.log(global)
}

test();

console.log(local);
console.log(global);

L'output è falso, falso, falso, falso

Questo perché piuttosto che creare una nuova variabile nello scope o nella funzione locale utilizza semplicemente le variabili globali e le riassegna a false.


Direi che è meglio usare var nella maggior parte delle situazioni.

Le variabili locali sono sempre più veloci delle variabili nell'ambito globale.

Se non si utilizza var per dichiarare una variabile, la variabile sarà nell'ambito globale.

Per ulteriori informazioni, puoi cercare "scope chain JavaScript" in Google.


Dovresti sempre usare la parola chiave var per dichiarare le variabili. Perché? Una buona pratica di codifica dovrebbe essere una ragione sufficiente di per sé, ma dichiarare una variabile senza la parola chiave var significa dichiararla nell'ambito globale (una variabile come questa è chiamata global "implicita"). Douglas Crockford consiglia di non utilizzare mai le global implicite e in base alle linee guida sulla codifica JavaScript di Apple :

Qualsiasi variabile creata senza la parola chiave var viene creata nell'ambito globale e non è garbage collection quando la funzione restituisce (perché non esce dall'ambito), presentando l'opportunità di una perdita di memoria.

Quindi, in breve, dichiarare sempre le variabili usando la parola chiave var .


L'utilizzo di var è sempre una buona idea per evitare che le variabili ingombrino l'ambito e le variabili globali da conflitti tra loro, causando sovrascrittura indesiderata.


Quando Javascript viene eseguito in un browser, tutto il codice è circondato da un'istruzione with, in questo modo:

with (window) {
    //Your code
}

Maggiori informazioni su with - MDN

Poiché var dichiara una variabile nell'ambito corrente , non vi è alcuna differenza tra dichiarare var all'interno della finestra e non dichiararlo affatto.

La differenza arriva quando non ci si trova direttamente all'interno della finestra, ad esempio all'interno di una funzione o all'interno di un blocco.

L'utilizzo di var ti consente di nascondere le variabili esterne che hanno lo stesso nome. In questo modo puoi simulare una variabile "privata", ma questo è un altro argomento.

Una regola generale è quella di usare sempre var , perché altrimenti si corre il rischio di introdurre bug sottili.

EDIT: Dopo le critiche che ho ricevuto, vorrei sottolineare quanto segue:

  • var dichiara una variabile nell'ambito corrente
  • L'ambito globale è la window
  • Non utilizzare var dichiara implicitamente var nell'ambito globale (finestra)
  • Dichiarare una variabile nello scope globale (finestra) usando var equivale a ometterlo.
  • Dichiarare una variabile in ambiti diversi dalla finestra usando var non è la stessa cosa che dichiarare una variabile senza var
  • Dichiarare sempre var esplicito perché è una buona pratica

Se sei nell'ambito globale allora non c'è molta differenza. Leggi Kangax's risposta Kangax's per la spiegazione

Se ci si trova in una funzione, var creerà una variabile locale, "no var" cercherà la catena dell'ambito finché non trova la variabile o raggiunge l'ambito globale (a quel punto verrà creato):

// These are both globals
var foo = 1;
bar = 2;

function()
{
    var foo = 1; // Local
    bar = 2;     // Global

    // Execute an anonymous function
    (function()
    {
        var wibble = 1; // Local
        foo = 2; // Inherits from scope above (creating a closure)
        moo = 3; // Global
    }())
}

Se non stai facendo un compito allora devi usare var :

var x; // Declare x

Senza var - variabile globale.

Fortemente raccomandato di usare var istruzione var , perché la variabile globale di init nel contesto locale è malvagia. Ma, se hai bisogno di questo trucco sporco, dovresti scrivere un commento all'inizio della pagina:

/* global: varname1, varname2... */

Vedo che le persone sono confuse quando dichiarano le variabili con o senza var e dentro o fuori la funzione. Ecco un esempio profondo che ti guiderà attraverso questi passaggi:

Guarda la sceneggiatura qui sotto in azione qui su jsfiddle

a = 1;// Defined outside the function without var
var b = 1;// Defined outside the function with var
alert("Starting outside of all functions... \n \n a, b defined but c, d not defined yet: \n a:" + a + "\n b:" + b + "\n \n (If I try to show the value of the undefined c or d, console.log would throw 'Uncaught ReferenceError: c is not defined' error and script would stop running!)");

function testVar1(){
    c = 1;// Defined inside the function without var
    var d = 1;// Defined inside the function with var
    alert("Now inside the 1. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);

    a = a + 5;
    b = b + 5;
    c = c + 5;
    d = d + 5;

    alert("After added values inside the 1. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);
};


testVar1();
alert("Run the 1. function again...");
testVar1();

function testVar2(){
    var d = 1;// Defined inside the function with var
    alert("Now inside the 2. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);

    a = a + 5;
    b = b + 5;
    c = c + 5;
    d = d + 5;

    alert("After added values inside the 2. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);
};

testVar2();

alert("Now outside of all functions... \n \n Final Values: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n You will not be able to see d here because then the value is requested, console.log would throw error 'Uncaught ReferenceError: d is not defined' and script would stop. \n ");
alert("**************\n Conclusion \n ************** \n \n 1. No matter declared with or without var (like a, b) if they get their value outside the function, they will preserve their value and also any other values that are added inside various functions through the script are preserved.\n 2. If the variable is declared without var inside a function (like c), it will act like the previous rule, it will preserve its value across all functions from now on. Either it got its first value in function testVar1() it still preserves the value and get additional value in function testVar2() \n 3. If the variable is declared with var inside a function only (like d in testVar1 or testVar2) it will will be undefined whenever the function ends. So it will be temporary variable in a function.");
alert("Now check console.log for the error when value d is requested next:");
alert(d);

Conclusione

  1. Non importa dichiarato con o senza var (come a, b) se ottengono il loro valore al di fuori della funzione, ne conserveranno il valore e anche tutti gli altri valori aggiunti all'interno di varie funzioni attraverso lo script vengono mantenuti.
  2. Se la variabile è dichiarata senza var all'interno di una funzione (come c), si comporterà come la regola precedente, d'ora in poi manterrà il suo valore su tutte le funzioni. O ha il suo primo valore nella funzione testVar1 () conserva ancora il valore e ottiene un valore aggiuntivo nella funzione testVar2 ()
  3. Se la variabile è dichiarata con var solo all'interno di una funzione (come d in testVar1 o testVar2) sarà indefinita ogni volta che la funzione termina. Quindi sarà una variabile temporanea in una funzione.

un'altra differenza ad es

var a = a || [] ; // works 

mentre

a = a || [] ; // a is undefined error.




ecmascript-5