2016-10-31 7 views
1
<!DOCTYPE> 
<html> 
<head> 
    <link rel="stylesheet" href="styles.css"/> 
    <body> 
     <ul id="people-list"></ul> 
     <script src="app.js"/> 
    </body> 
</head> 
</html> 

***app.js*** 

var people = ["alf","kay","jay","may"]; 
var list = document.getElementById("people-list"); 
for(var i =0; i< people.length; i++){ 
    var person = people[i]; 
    var element = document.createElement("li"); 
    (function(){ 
    var person = person; 
    element.innerText = person; 
    element.addEventListener("click",function(){ 
     alert("You clicked on "+ person); 
    }); 
    }()); 
    list.appendChild(element); 
} 

Warum ist das „Person“ Variable im globalen Bereich erstellt nicht in der IIFE verwiesen wird und erzeugt daher eine Liste von undefineds aber dann einer Änderung in den Variablennamen aus (Beispiel var. Person zu var person2 und nachfolgende Änderung in der Warnung) in IIFE macht den Code richtig funktioniert.Verwirrung über Umfang und Hebt in Javascript

+1

'person'isn't im globalen Bereich geschaffen. Wenn Sie eine Variable ohne 'var'-Definition erstellen, wird sie dem globalen Gültigkeitsbereich zugewiesen. Sonst wird es in seinem entsprechenden Umfang erstellt. – Aer0

+1

Und 'var person = person' ist sinnlos –

+0

Aber vor dem IIFE gibt es eine Personenvariable, die im globalen Geltungsbereich erstellt wird, der die verschiedenen Personenindizes gleichgesetzt werden. Habe ich recht? –

Antwort

3

Aufgrund var person = person Hissen entspricht exakt

var person; 
person = person; 

Sie können nicht auf die person Variable in dem äußeren Umfang beziehen. Es wird vollständig von der lokalen Variablen überschattet, sodass Sie die undefinierte lokale Variable sich selbst zuweisen.

2

Warum ist die „Person“ Variable im globalen Bereich erstellt nicht in der IIFE verwiesen wird

Da Sie eine person Variable im Rahmen der IIFE welche Masken es haben.

Wenn Sie zwei Variablen mit demselben Namen in verschiedenen Bereichen haben, können Sie nur auf den im Bereich nächstgelegenen Bereich zugreifen.


Hissen keinen Unterschied machen, weil var person in der ersten Zeile des IIFE erscheint.

Wenn es auf einer anderen Linie in der IIFE erschien, dann würde es gehisst werden und gleichbedeutend damit, es in der ersten Zeile zu haben.

-1

Bei der Deklaration einer Variablen über var wird immer der Funktionsumfang von JavaScripts verwendet. Um Variablen in globalen Gültigkeitsbereichen zu deklarieren, verlassen Sie einfach die var Definition.

var person = "your person" // function scope 
person = "your person" // global scope 

Sowieso Sie erklären nur die gleiche Variable zweimal. Was im Grunde bedeutet, dass Sie Ihre zuvor definierte Definition von überschreiben. In diesem Fall haben Sie am Ende eine undefined Variable, wie Sie in Ihrem Beispiel gesehen haben.

+0

Ich zögere, in Bezug auf Ihren ersten Punkt zu verschieben, ich denke, wenn Sie eine Variable mit dem Schlüsselwort var außerhalb einer Funktion erstellen, ist es immer noch im globalen Bereich registriert. Geben Sie eine Variable mit dem Schlüsselwort var in eine Browserkonsole ein und checken Sie in "window" ein, Sie finden es dort. –

0

Sie können person nicht verwenden, um auf die Outer-Scope-Schleifenvariable zu verweisen, wenn Sie bereits den Namen für die lokale Variable verwenden, ist schattiert. Sie können entweder einen Parameter

var person = people[i]; 
(function (person){ 
    … 
}(person)); 

oder nicht verwenden, um einen äußeren Umfang person überhaupt passieren:

(function(){ 
    var person = people[i]; 
    … 
}());