【发布时间】:2016-10-31 09:45:56
【问题描述】:
<!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);
}
为什么在全局作用域中创建的“person”变量没有在 IIFE 中被引用,因此会生成一个未定义列表,但变量名称从(例如 var person 到 var person2 以及随后的警报更改) ) 在 IIFE 中使代码正常工作。
【问题讨论】:
-
person不是在全局范围内创建的。创建没有vardefinition 的变量会将其提升到全局范围。否则它将在相应的范围内创建。 -
而
var person = person毫无意义 -
但是在IIFE之前,在全局范围内创建了一个person变量,对应people的各种索引。我说的对吗?
-
只需评论
var person = person;并测试!var person会将变量提升为undefined,这就是variable hoisting的全部意义所在..
标签: javascript scope hoisting