習慣於OOP語言編程後,會發現Javascript世界有很多匪夷所思的奇奇怪怪的現象(比如閉包),我花了大量的精力研究這些奇怪現象的根源,最後發現:源自於javascript的範圍不是塊級範圍,同時它有一套基於範圍鏈的標識尋找機制。本文大部分內容來自互連網,經過整理、改進而成。
最後介紹一個奇怪現象:下面的代碼,為什麼滑鼠移動到li上,title總是6,而不是我們所預想的數字呢?看你能不能根據以上的知識,解釋這種現象的原因。提示:變數尋找機制。
<html>
<head>
<title>迴圈內的閉包 應該謹慎</title>
</head>
<body>
<ul id="list">
<li>第1條記錄</li>
<li>第2條記錄</li>
<li>第3條記錄</li>
<li>第4條記錄</li>
<li>第5條記錄</li>
<li>第6條記錄</li>
</ul>
<script type="text/javascript">
var list_obj = document.getElementById("list").getElementsByTagName("li"); //擷取list下面的所有li的對象數組
for (var i = 0; i <= list_obj.length; i++) {
list_obj[i].onmousemove = function() {
this.style.backgroundColor = "#eee";
document.title=i
};
list_obj[i].onmouseout = function() {
this.style.backgroundColor = "#fff";
}
}
</script>
</body>
</html>複製代碼
為什麼上面的代碼改成下面的就好了呢?
<html>
<head>
<title>迴圈內的閉包 應該謹慎</title>
</head>
<body>
<ul id="list">
<li>第1條記錄</li>
<li>第2條記錄</li>
<li>第3條記錄</li>
<li>第4條記錄</li>
<li>第5條記錄</li>
<li>第6條記錄</li>
</ul>
<script type="text/javascript">
var list_obj = document.getElementById("list").getElementsByTagName("li"); //擷取list下面的所有li的對象數組
for (var i = 0; i <= list_obj.length; i++) {
(function(i){
list_obj[i].onmousemove = function() {
this.style.backgroundColor = "#eee";
document.title=i
};
list_obj[i].onmouseout = function() {
this.style.backgroundColor = "#fff";
}
})(i);
}
</script>
</body>
</html>複製代碼
文章轉載自:http://www.cnblogs.com/kaima/archive/2009/03/07/advanced_javascript_concept.html