javascriptのクローズド

9978 ワード

&噫13;
title{color=0000 ff 7200;font-size:23 px;line-height:28 px}&嗳唗13
none{color=ble 99 c}&腣13;
.red{color=0000 ff}&菗13;
h.subject{border:none!impotant;色彩:(zhi i i i i i i i i i i i i i i i i 862 C;)&啣唵13;
//*細い線の表*/&𞃳13;
filament(u)table{&夝13;
text-align:センター;
background:瑭000;&噫13;
[/color][/url]菗fff;&𞃳13;
border:1 px sold啝e bebeb;&萶13;
border-collappse:collappse;
width:90%&菗13;
}&{13;
&噫13;
filament(u)table thead th{&噫13;
background:_;&_;13;
カラー:(zhi F 80;&zhi 13;)
}&{13;
&噫13;
filament(u)table tbody td,filament_table tbody th{&獠13;
border:1 px sold啝e bebeb;&萶13;
}&{13;
&噫13;
filament(u)table tbody th{&獠13;
background:璖004040&噫13;
}&{13;
ヽoo......................................................digg{display:none!impotant]&呭13;
今日はもう大丈夫です.クローズドの使用を見て、クローズドのものを整理します.
閉じたパケットの定義は非常に不明瞭である.閉じたパケットとは、文法領域がある特定の領域に位置し、持続的参照(読み書き)がその領域内の自身の範囲以外の実行領域に位置する非永続的変数値能力を有する段落のことである.これらの外部実行領域の非永続型変数は、カプセル化が最初に定義(または作成)されたときの値(深い結合)を不思議に保持しています.簡単に言えば、クローズドとは別のスコープにおいて前の関数またはスコープから取得した変数(キーの値ペア)を保存していますが、これらのキーの値は前のレベルの関数の実行に従って破棄されません.周愛民はもっとはっきり言います.閉包は「属性表」です.閉包はデータブロックです.閉包は「Name=Value」を保管している対照表です.こんなに簡単です.ただし、クローズドは運行期間の概念であることを強調しなければならない.
Javascriptではクローズドされています.二つの特徴があります.
  • は、関数変数の1つの参照として、関数が返されると、アクティブ状態になります.
  • のクローズドパケットは、関数が戻ったときに、リソースが解放されていないスタック領域である.
  • 今のところ比較的納得できるクローズドの実現には、次の3つがあります.
    
    with(obj){
        //       
        }
    
    
    (function(){
        //    
        })()
    
    
    try{
    //...
    } catch(e) {
    //catch    IE   
    }
    
    いくつかの有用な例
    
    //*************  uniqueID*************
    uniqueID = (function(){ //            
    	var id = 0; //          
    	//                     
    	//          uniqueID      .
    	return function(){return id++;};  //  ,  .
    })(); //          . 
    document.writeln(uniqueID()); //0
    document.writeln(uniqueID()); //1
    document.writeln(uniqueID()); //2
    document.writeln(uniqueID()); //3
    document.writeln(uniqueID()); //4
    
    
    //*************    *************
    var a = (function(n){
    	if(n<1){ alert("invalid arguments"); return 0; }
    	if(n==1){ return 1; }
    	else{ return n * arguments.callee(n-1); }
    })(4);
    document.writeln(a);
    
    
    function User( properties ) {    
        //                 instance    
        var objthis = this;    
        for ( var i in properties ) {    
            (function(){    
                    //    ,t      ,  properties[i]    for       
                    var t = properties[i];    
                    objthis[ "get" + i ] = function() {return t;};    
                    objthis[ "set" + i ] = function(val) {t = val;};    
            })();     
        }    
    }    
        
    //        
    var user = new User({    
        name: "Bob",    
        age: 44    
    });    
        
    alert( user.getname());    
    alert( user.getage());    
        
    user.setname("Mike");    
    alert( user.getname());    
    alert( user.getage());    
        
    user.setage( 22 );    
    alert( user.getname());    
    alert( user.getage());   
    
    今日見た問題を添付します.
    要求:
    これらの3つのノードのOnclickイベントを適切にパラメータをイジェクトすることができるようにする.
    
    <ul>
       <li id="a1">aa</li>
       <li id="a2">aa</li>
       <li id="a3">aa</li>
    </ul>
    
    <script type="text/javascript">
    
    for(var i=1; i < 4; i++){
       var id = document.getElementById("a" + i);
       id.onclick = function(){
        	alert(i);//      4
       }
    }
    </script>
    
    >
    <title>javascriptクローズドby司徒正美(/title)
    <meta charset=「utf-8」/>
    <meta name=「keywords」content=「javascriptクローズドby司徒正美」/>
    <meta name=「description」content=「javascriptクローズドby司徒正美」/>
    <script type=「text/javascript」>
    window.onload=function(){
    for(var i=1;i<4;i+){
    var id=document.getElemenntById(「a」+i);
    id.onclick=function(){
    alert(i)//今は戻ります.
    )
    )
    )

    <h 1>javascript閉包by司徒正美(/h 1)
    <ul>
    <li id=“a 1”aa<li id=“a 2”aa<li id=「a 3」>a
    実行コード
    私の説明では、onclickのバインディング関数function(){alert(i)}の作用領域は対応liオブジェクトで、その中のalertのiの作用領域はwindowで、毎回循環はすべてwindow.iの値を書き換えているので、サイクルは終わって、iはすでに4で、どのli元素をクリックしても4です.
    解決方法:
  • は、関数を使用してパケットを閉じます.
    
          var lists = document.getElementsByTagName("li");
          for(var i=0,l=lists.length; i < l; i++){
            lists[i].onclick = (function(i){//        
              return function(){
                alert(i);
              }
            })(i);
          }
            
    
          var lists = document.getElementsByTagName("li");
          for(var i=0,l=lists.length; i < l; i++){
            lists[i].onclick = new function(){
              var t = i;
              return function(){
                alert(t+1)
              }
            }
          }
            
    >
    <title>javascriptクローズドby司徒正美(/title)
    <meta charset=「utf-8」/>
    <meta name=「keywords」content=「javascriptクローズドby司徒正美」/>
    <meta name=「description」content=「javascriptクローズドby司徒正美」/>
    <script type=「text/javascript」>
    window.onload=function(){
    var lists=document.getElements ByTagName(「li」)
    for(var i=0、l=lists.length;i<l;i++){
    lists[i].onclick=function()
    var t=i
    return function(){
    alert(t+1)
    )
    ()
    )
    )

    <h 1>javascriptクローズドby司徒正美(関数クローズド)<h 1>
    <ul>
    <li id=“a 1”aa
  • <li id=“a 2”aa<li id=「a 3」>a
    実行コード
  • イベントエージェント
    
        var ul = document.getElementsByTagName("ul")[0];
        ul.onclick = function(){
          var e = arguments[0] || window.event,
          target = e.srcElement ? e.srcElement : e.target;
          if(target.nodeName.toLowerCase() == "li"){
            alert(target.id.slice(-1))
          }
        }
            
    >
    <title>javascriptクローズドby司徒正美(/title)
    <meta charset=「utf-8」/>
    <meta name=「keywords」content=「javascriptクローズドby司徒正美」/>
    <meta name=「description」content=「javascriptクローズドby司徒正美」/>
    <script type=「text/javascript」>
    window.onload=function(){
    var ul=document.getElements ByTagName("ul")[0];
    ul.onclick=function(){
    var e=argments[0]𞓜window.event、
    target=e.srcellement?e.srce lement:e.target;
    if(target.nodeName.toLowerCase()=“li”){
    alert(target.id.slice(-1))
    )
    )
    )

    <h 1>javascriptクローズby司徒正美(イベントエージェント)
    <ul>
    <li id=“a 1”aa
  • <li id=“a 2”aa<li id=「a 3」>a
    実行コード
  • は、一時変数を要素ノードに保持する.
    
          var lists = document.getElementsByTagName("li");
          for(var i=0,t=0,el; el = list[i++];){
            el.i = t++
            el.onclick = function(){
              alert(this.i)
            }
          }
            
    >
    <title>javascriptクローズドby司徒正美(/title)
    <meta charset=「utf-8」/>
    <meta name=「keywords」content=「javascriptクローズドby司徒正美」/>
    <meta name=「description」content=「javascriptクローズドby司徒正美」/>
    <script type=「text/javascript」>
    window.onload=function(){
    var lists=document.getElements ByTagName(「li」)
    for(var i=0、t=1、el;el=lists[i+]){
    el.i=t++
    el.onclick=function(){
    alert(this.i)
    )
    )
    )

    <h 1>javascriptクローズドby司徒正美(臨時変数をある対象の属性に変更)<h 1>
    <ul>
    <li id=“a 1”aa
  • <li id=“a 2”aa<li id=「a 3」>a
    実行コード
  • with文を使用したオブジェクトのクローズド.
    
       var els = document.getElementsByTagName("li")
            for(var i=0,n=els.length;i<n;i++){
              with ({i:i})
              els[i].onclick = function() { alert(this.innerHTML+i) };
            }
            
    >
    <title>javascriptクローズドby司徒正美(/title)
    <meta charset=「utf-8」/>
    <meta name=「keywords」content=「javascriptクローズドby司徒正美」/>
    <meta name=「description」content=「javascriptクローズドby司徒正美」/>
    <script type=「text/javascript」>
    window.onload=function(){
    var els=document.getElements ByTagName(「li」)
    for(var i=0,n=els.length;i<n;i+){
    with({i:i})
    els[i].onclick=function(){alert(i)}
    )
    )

    <h 1>javascriptクローズドby司徒正美(対象クローズド)
    <ul>
    <li id=“a 1”aa
  • <li id=“a 2”aa<li id=「a 3」>a
    実行コード
  • try...catch文で構成された異常なクローズド:
    
          var lists = document.getElementsByTagName("li");
          for(var i=0,l=lists.length; i < l; i++){
            try{
              throw i;
            }catch(i){
              lists[i].onclick =  function(){
                alert(i)
              }
            }
          }
         
    >
    <title>javascriptクローズドby司徒正美(/title)
    <meta charset=「utf-8」/>
    <meta name=「keywords」content=「javascriptクローズドby司徒正美」/>
    <meta name=「description」content=「javascriptクローズドby司徒正美」/>
    <script type=「text/javascript」>
    window.onload=function(){
    var lists=document.getElements ByTagName(「li」)
    for(var i=0、l=lists.length;i<l;i++){
    try{
    throw i;
    }catch(i){
    lists[i].onclick=function()
    alert(i)
    )
    )
    )
    )

    <h 1>javascriptクローズドby司徒正美(異常クローズ)
    <ul>
    <li id=“a 1”aa
  • <li id=“a 2”aa<li id=「a 3」>a
    実行コード
    
    
          var els = document.getElementsByTagName("li");
        
          (''+Array(els.length+1)).replace(/./g,function(a,i){
            els[i].onclick=function(){alert(i)}
          })