javascriptの閉鎖の一例
16132 ワード
<html>
<head>
<title>elementFromPoint</title>
<script type="text/javascript">
window.onload = function(){
for(var i=0; i<6; i++){
var alink = document.createElement('a');
var titleText = document.createTextNode(' ' + (i+1) + ' ');
alink.appendChild(titleText);
alink.href = "javascript:void(0)";
alink.onclick = function(){alert(i)};
var div = document.getElementById('show-detail');
div.appendChild(alink);
}
}
</script>
</head>
<body>
<div id="show-detail"> </div>
</body>
</html>
これはlinkのセットです.どのlinkをクリックしても結果はいつも6です.なぜですかこの6つのlinkはクリックするたびに関数をトリガするからです.この関数の役割は現在のi値を印刷し、6つのlinkタグを追加した後、メモリのi値はすでに6になりました.したがって、どのlinkをクリックしても、6がイジェクトされます.
どのlinkをクリックしても、対応する数字がポップアップされますが、どうやって解決しますか?解決方法はjavascriptの閉鎖特性です.
クローズド---------------------------------------------------------------------------------------------
クローズドについては、以下のURLをご覧ください.
http://www.jb51.net/article/24101.htm
関数aの内部関数bが関数a以外の変数Cによって参照されると、クローズドパケットが作成されるということです.クローズドの役割は、aが実行されてから戻った後、Javascriptのゴミ回収メカニズムGCはaによって占有された資源を回収しないようにします.aの内部関数bの実行はaの変数に依存する必要があります.例は以下の通りです
function a(name)
{
var num=0;
function b()
{
alert("name:"+name+";num:"+num);
num++;
}
return b;
}
var c = a("c");
var d = a("d");
c(); //name:c;num:0
d(); //name:d;num:0
c(); //name:c;num:1
d(); //name:d;num:1
クローズド特性のため、aは常にメモリに存在しており、毎回c()またはd()、cとdに対応するaオブジェクトはnum++になります.この部分についてはドメインチェーンという概念があります.よく分からないのは自分で調べられます.例の修正----------------------------------------------------------------------------------------------------------------------------------------------------
したがって、上記の例については、次のように修正することができます.
<html>
<head>
<title>elementFromPoint</title>
<script type="text/javascript">
window.onload = function(){
for(var i=0; i<6; i++){
var alink = document.createElement('a');
var titleText = document.createTextNode(' ' + (i+1) + ' ');
alink.appendChild(titleText);
alink.href = "javascript:void(0)";
alink.onclick= showI(i);
var div = document.getElementById('show-detail');
div.appendChild(alink);
}
}
function showI(i)
{
var num=0;
var a= function(){alert("i:"+i+";num:"+num++);}
return a;
}
</script>
</head>
<body>
<div id="show-detail"> </div>
</body>
</html>
修正後に見られます.各linkをクリックして、対応する番号をポップアップできます.alink.onclick=showI(i) alink.onclickは関数showIの内部オブジェクトaを指すため、showIオブジェクトはGCに回収されず、各alinkはショーIオブジェクトに対応しています.alinkをクリックすると、それぞれの対応するshowIオブジェクトをトリガします.コードには6つのalinkが生成されていますが、これら6つのalinkにはそれぞれ6つの「クローズド関数」showI(i)が割り当てられています.各クローズド関数には、alinkに対応する番号iが格納されています.クローズド特性のため、この6つのshowIオブジェクトはリリースされず、メモリに一致して保存されますので、6つのlinkはそれぞれクリックすると、該当する番号が表示されます.
function showI(i){ var num=0; //ここにnumを一つ追加します.各linkをクリックするとnum++は相互に影響しないということです. var a=function(){alert("i:"+i+";num:"+num+);] return a;
本論文の例は以下のとおりである http://blog.csdn.net/xiaohai0504/article/details/7735971