JavaScriptのforサイクルは常に最大値の問題を出力するいくつかの解決方法です.

6201 ワード

もし私たちがタブを作ったら、それぞれのliをクリックして切り替えられますが、この時にforサイクルを使って対応するli値を取得した時、一つの問題が見つかりました.つまり、どのliをクリックしても、それはいつも最後の値を出力します.この問題を解決する方法は次のいくつかあります.
ここはhtmlの部分コードです.三つのliでデモします.
<ul id="box">
    <li>1li>
    <li>2li>
    <li>3li>
ul>
<script>
    window.onload = function(){
        var oul = document.getElementById('box');
        var oli = oul.getElementsByTagName('li');
        //   js              
        ......
script>
以下はjavascriptの実現コードです.
//  1:     ,i              
for(var i=0;ifunction(j){
        oli[i].onclick = function(){
            console.log(j);
        }
    })(i);//      
}
//  2:     ,i              
for(var i=0;ifunction(){
        var tmp = i;//        
        oli[i].onclick = function(){
            console.log(tmp);
        }
    })();
}
//  3:     ,            
for(var i=0;ifunction(arg){
        return function(){//      
            console.log(arg);
        }
    }(i);
}
//  4:    i       li   
for(var i=0;i//index         
    oli[i].onclick = function(){
        console.log(this.index);
    }   
}
//  5:    i          
for(var i=0;ifunction(){
            console.log(arguments.callee.index);
    }).index = i;//index         
}
caleeは実行中のFunctionオブジェクト、すなわち指定されたFunctionオブジェクトの本文を返します.calee属性は、関数オブジェクト自体に対する参照を表すアーグメンントオブジェクトのメンバーです.
//  6: Function  ,                    
for(var i=0;inew Function("console.log("+i+");");
}
//Function("console.log("+i+");")   
//function anonymous() {
//console.log(i);
//}
ECMAScriptはFunctionクラスで直接関数を作成する文法:
var function_name = new Function(arg1, arg2, ..., argN, function_body);
上記の形態では、各argは一つのパラメータであり、最後のパラメータは関数本体(実行するコード)である.このように関数を構成すると、function_を出力します.nameは、関数全体の本当のエンティティを見ることができます.以下のとおりです
//             ,       , function_body  
//console.log(arg1+arg2),         ,         
function anonymous(arg1,arg2
/*``*/) {
console.log(arg1+arg2);
}
//  7: Function  , 6     
for(var i=0;iFunction("console.log("+i+");");
}