2017-09-15 5 views
2

Ich habe einige Gedanken darüber gegeben, eine Variable namens undefined zu deklarieren und einen truthy if-else Ausdruck damit auszuwerten. Ich habe herausgefunden, dass dies im globalen Rahmen nicht möglich ist. Aber in MDN habe ich einige interessante Erkenntnisse über den undefined Datentyp gefunden. Ich ziehe direkt aus MDNundefiniert als gültiger Variablenname im lokalen Gültigkeitsbereich

undefined ist eine Eigenschaft des globalen Objekts; h. es ist eine Variable im globalen Gültigkeitsbereich.

Es sagt nichts über lokalen Bereich. Das heißt, ich kann einen im lokalen Bereich erstellen. Also gehe ich weiter, um diese Einsicht zu testen. Ich habe ein Objekt, und weisen ein Verfahren, um es erstellt

var person = { 
    method : function(){ 

     var undefined = 2 

     if(undefined){ 
      console.log("undefined works as a variable") 
     } 

    } 
} 

person.method() 

Und erraten, was! Die if-Anweisung besteht den Test und die Zeichenfolge innerhalb der console.log() wird auf der Konsole gedruckt. Dies könnte eine gefährliche Sache und natürlich eine schlechte Praxis sein. Gibt es eine Möglichkeit, die Deklaration einer Variablen, die nach undefined Schlüsselwort in lokalem JavaScript-Bereich benannt ist, zu verhindern? Vielen Dank!

+0

Mögliche Duplikat [var undefiniert = true;] (https://stackoverflow.com/questions/2534260/var-undefined-true) –

+0

@ nem035 wird –

+1

nicht funktionieren * "Gibt es eine Möglichkeit zu verhindern, die Deklaration einer Variablen, die nach dem Schlüsselwort 'undefined' im lokalen Bereich von Javascript benannt ist? "* Warum genau fragen Sie? Was ist dein ultimatives Ziel? Möchten Sie verhindern, dass Sie eine solche Variable erstellen? Wer sonst schreibt Code "im lokalen Bereich", wenn nicht Sie selbst? –

Antwort

3

Um versehentliche Änderung von undefined zu umgehen, sollten Sie dieses gefährliche Wort in Ihrem Code überhaupt nicht schreiben.

Da Sie nur den Zugriff müssen undefined lesen, wird es void 0 stattdessen zu immer empfohlen, die undefined zurückgibt.

var person = { 
 
    method: function() { 
 

 
     var undefined = 2 
 

 
     if(void 0) { 
 
      console.log("this should never be printed") 
 
     } else { 
 
      console.log("void 0 is always undefined, no matter what you do") 
 
     } 
 

 
    } 
 
} 
 

 
person.method()

Wie mit void 0 arbeiten und vollständig von dem Wort "undefiniert" loswerden?

// Turn 
if(myVariable === undefined) { ... } 
if(typeof myVariable === "undefined") { ... } 
// into 
if(myVariable === void 0) { ... } 

// Turn 
if((myVariable === undefined) || (myVariable === null)) { ... } 
// into 
if(myVariable == null) { ... } 

// Turn 
myObject.someKey = undefined 
// into 
myObject.someKey = void 0 
+0

Aber 'if (void 0) {' ist wirklich nicht nützlich, da niemand wirklich 'if (undefined) {' schreibt. Was ist wahrscheinlicher, dass etwas gegen 'undefiniert' getestet werden muss, wie: 'if (x === undefined) {'. Wie würde das mit "void 0" funktionieren? –

+0

'if (x === void 0) {' (siehe meine Antwort) – ideaboxer

+0

Warum nicht nur 'if (x) {}'? –

2

Willkommen in der wunderbaren Welt von JavaScript!

Es gibt keine Möglichkeit, jemanden davon abzuhalten, dies zu tun, aber es gibt eine Möglichkeit, undefinedundefined zu setzen, wenn Sie Ihre Funktionen wie folgt einrichten (nicht dass Sie dies wirklich tun müssten, weil es sehr wäre schlechte Praxis für jeden, eine Variable namens undefined) einzurichten. Im Wesentlichen kleinere Bereichsfunktionen könnten eine höhere undefined Variable verbergen.

// This is just a way to get a variable called "undefined" 
 
function wrapper(){ 
 
    var undefined = 10; 
 
    console.log("wrapper says undefined is: " + undefined); 
 

 
    // This function declared a parameter called "undefined", 
 
    // but if the function gets called with no argument, then 
 
    // the value of this, more local, argument will truly be 
 
    // undefined. If arguments are needed, just add "undefined" 
 
    // to the end of the list. 
 
    function foo(undefined){ 
 
    // Formal test to ensure that undefined is what we believe it to be: 
 
    if(typeof undefined === "undefined"){ 
 
     console.log("foo says undefined is: " + undefined); 
 
    } 
 
    } 
 
    
 
    // When foo is called with no arguments passed in, the parameter 
 
    // "undefined" will take on a value of undefined within the scope 
 
    // of that function. 
 
    foo(); 
 
} 
 

 
wrapper();

Nun, das ist ein wenig gekünstelt, wie Sie nicht mit einem „fake“ Argument einzurichten alle Funktionen gehen, aber man konnte testen, um zu sehen, ob undefined mit verändert wurde :

function wrapper(){ 
 
    var undefined = 10; 
 
    console.log(undefined); 
 
    
 
    function foo(){ 
 
    
 
    if(typeof undefined === "undefined"){ 
 
     // undefined has not been altered 
 
    } else { 
 
     // undefined has been altered, so reset it for this scope: 
 
     let undefined; 
 
     console.log(undefined); 
 
    } 
 
    
 
    } 
 
    
 
    foo(); 
 
} 
 

 
wrapper();

Am Ende aber, Sie könnten einfach verhindern, dass dies Auswirkungen auf Ihre Funktionen hat, indem Sie var undefined in Ihre Funktionen einfügen. Durch das Hochziehen wird sichergestellt, dass dies an der Spitze Ihrer Funktion eintritt, egal wo Sie es deklarieren.

1

Ich kann keine Möglichkeit finden, es zu stoppen, aber ja, Sie können es beschränken, indem Sie das Ja innerhalb übergeben Wenn Sie den Bereich lokal mit ES6 machen können.

Sie werden feststellen, wie Umfang, wenn jetzt geändert wird, und es ist nicht das Gleiche.

var person = { 
    method : function(){ 

    let undefined = 2 

    if(undefined){ 
     console.log("undefined works as a variable") 
    } 

    } 
} 
Verwandte Themen