2015-11-22 5 views
14

Ho una buona conoscenza dell'ambito dell'ambito JavaScript - che il linguaggio ha un ambito a livello di funzione e le dichiarazioni di variabili e funzioni sono issate in cima al loro ambito di contenimento. Tuttavia, non riesco a capire il motivo per cui i due pezzi di codice log valori diversi:Confusione con lo scope JavaScript

Questo registra il valore 1 alla console:

var a = 1; 
function b() { 
    a = 10; 
    return; 
    function a() {} 
} 
b(); 
console.log(a); 

e misteriosamente, questa registra 10:

var a = 1; 
function b() { 
    a = 10; 
    return;   
} 
b(); 
console.log(a); 

Quindi cosa succede sotto il cofano?

+3

['use strict'] (http://stackoverflow.com/questions/1335851/) non consentirebbe di dichiarare una funzione come nel primo esempio, quindi è probabilmente un'idea molto cattiva per cominciare. – transistor09

+0

Interessante, ma è più come un problema di design. –

risposta

13

trovo il primo esempio più misterioso ...

Nel secondo esempio, non si dichiara una variabile a all'interno della funzione. Quindi, quando si assegna a a, il target è lo a all'esterno. Abbastanza diretto.

Nel primo esempio, si dichiara una variabile a all'interno della funzione, ma in un modo insolito: dichiarando una funzione denominata a. Quindi assegnando a a userà quella "variabile" locale.

due cose da portare via qui:

a) dichiarazioni di variabili e funzioni sono "issato" al top della loro portata. Mentre function a(){} è scritto vicino alla fine, la variabile a per tenerlo è già creata e visibile nella parte superiore dell'ambito.

b) Le funzioni possono essere anche utilizzate come variabili. Puoi passare le funzioni in giro, puoi riassegnare le definizioni delle funzioni. Condividono lo stesso spazio dei nomi con altre variabili.

1

È possibile utilizzare Visual-Studio per la codifica:

enter image description here

Programmazione del codice in un dattiloscritto-File vi permetterà di vedere i tipi di variabili passando il variabile.

enter image description here

sarà anche mettere in guardia, quando si tenta di applicare il numerico-valore 10 alla variabile "a", che è stato dichiarato prima di essere una funzione. Questo è quello che mi piace di dattiloscritto, è possibile ottenere ulteriori informazioni su di esso qui: http://www.typescriptlang.org/

+0

C'è un messaggio di avviso per andare con la linea rossa sotto l'assegnazione della variabile? – Thilo

+2

inline l'immagine per te – CupawnTae

+0

Grazie @CupawnTae – CoderPi

1

suo perché quando si utilizza un dichiarato function viene issata e trasformato in un'espressione di funzione, vale a dire var a = function() {}; Questo sta creando uno scontro con il tuo a variabile.

0

JavaScript è basato su interprete. Javascript {block} non ha un ambito, ma la funzione ha.

Nel tuo esempio,

var a = 1; 
function b() { 
    a = 10; 
    return; 
    function a() {} 
} 
b(); 
console.log(a); 

prima, si assegna a essere intero 10, ma alla fine si riassegni il a come una funzione che sarà scomparire alla fine del campo di applicazione.

In questo codice,

var a = 1; 
function b() { 
    a = 10; 
    return; 
    function foo() {} 
} 
b(); 
console.log(a); 

tua a non sostituito, e tornarono a portata globale, che sarà di log 10.