2017-11-20 3 views
-1

Im folgenden Code clobbering:Variable und Funktion mit dem gleichen Namen

//global scope 
function isValid() { 
    return "hello from isValid"; 
} 


function test() { 
    //local scope 
    var isValid = 9; 
    //..... 
    isValid(); 
} 

test(); 

ich den Fehler:

"TypeError: isValid is not a function 
    at test (devicok.js:10:5) 
    at devicok.js:12:1 
    at https://static.jsbin.com/js/prod/runner-4.1.1.min.js:1:13850 
    at https://static.jsbin.com/js/prod/runner-4.1.1.min.js:1:10792" 

Warum ist dies, wenn, wie ich es die isValid Funktion verstehen ist in a different scope als die isValid Variable? Es scheint, dass die Variable die Funktionsdefinition überschreibt. Ist das Problem, dass sie denselben Namespace verwenden, obwohl sie unterschiedliche Bereiche haben?

Code and error presented in jsbin.

+1

Wenn Sie einen Namen verweisen, erhalten Sie die Sache mit diesem Namen im engsten Umfang. Bei 'isValid();' enthält der nächstliegende Bereich etwas mit dem Namen 'isValid', also das, was Sie bekommen. Ja, sie teilen "denselben Namensraum" in dem Sinne, dass JavaScript keine Namensräume hat. – Ryan

Antwort

3

Es sind keine Namespaces in JavaScript - Funktionen und Variablen und alles live in einem einzigen. Ja, die äußere Variable wird durch die innere Deklaration beschattet - wenn Sie in der Funktion auf isValid verweisen, ist dies die lokale Variable. Das hat den Wert 9, kein Funktionswert und löst daher beim Aufruf eine Ausnahme aus.

0

Sie können wie folgt vorgehen;

//global scope 
 
function isValid() { 
 
    return "hello from isValid"; 
 
} 
 

 

 
function test() { 
 
    //local scope 
 
    var isValid = 9; 
 
    //..... 
 
    return this.isValid(); 
 
} 
 

 
console.log(test());

Verwandte Themen