javascriptの中でthisは違うシーンの使い方と方向について

14860 ワード

本論文では、Javascriptsにおけるthisのオブジェクトとしてのメソッド呼び出し、一般的な関数としての呼び出し、構造関数呼び出し、callまたはappyメソッドを使用して呼び出しなどのシーンでの使用法と指向について紹介します.
1.thisの指向
一般的でないwithとevalを除いた場合、具体的には実際の応用において、thisの指向は大体以下の4つに分けられます.
  • を対象とした方法で起動する.
  • は、一般関数として呼び出される.
  • コンストラクター呼び出し.
  • Function.prototype.callまたはFunction.prototype.appy呼び出し.
  • 1)オブジェクトとしてのメソッド呼び出し
    関数をオブジェクトとする方法が呼び出されると、thisはオブジェクトを指します.
    var obj = {
        name: 'lenhart,
        getName: function() {
            alert(this === obj); // true
            alert(this.name)
        }
    };
    obj.getName();
    
    2)普通の関数として呼び出す
    関数がオブジェクトの属性として呼び出されない場合、すなわち私たちがよく話している一般的な関数方式であり、このときのthisは常にグローバルオブジェクトを指す.ブラウザのjavascriptでは、このグローバルオブジェクトはwindowオブジェクトです.
    window.name = 'globalName';
    
    var getName = function() {
        return this.name;
    };
    
    console.log(getName())
    
    
    時々、divノードの時間関数の内部で、一部のcalback方法があります.calbackは普通の関数として呼び出された時、calback内部のthisはwindowを指しましたが、私達はよく彼にdivノードを指してもらいたいです.次のコードを参照してください.
    <html>
        <body>
            <div id="div1">    div</div>
        </body>
    
        <script>
    
            window.id = 'window';
    
            document.getElementById('div1').onclick(function(){
                alert(this.id); //    'div1'
                var callback = function(){
                    alert(this.id); //    'window'
                }
                callback();
            })
    
        </script>
    </html>
    
    この時は簡単な解決策があります.divノードの参照は変数で保存できます.
    document.getElementById('div1').onclick(function(){
        var that = this;
        var callback = function(){
            alert(that.id); //    'div1'
        }
        callback();
    })
    
    ECMAScript 5のstrictモードでは、この場合のthisはグローバルオブジェクトを指しないように規定されています.undefined:
    function func(){
        "use strict"
        alert(this);    //   :undefined
    }
    
    func();
    
    3)コンストラクタの呼び出し
    JavaScriptにはクラスがありませんが、コンストラクタからオブジェクトを作成することができます.また、new演算子を提供します.
    コンストラクタの外観語は普通の関数と似ています.違いは呼び出された方式です.new演算子で関数を呼び出すと、一つのオブジェクトが返されます.通常、コンストラクタの中のthisは戻りのこのオブジェクトを指します.次のコードを参照してください.
    var MyClass = function(){
        this.name = 'lenhart';
    };
    
    var obj = new MyClass();
    alert(obj.name);    //   :'lenhart'
    
    しかし、thisを使ってコンストラクタを呼び出す時、もう一つの問題に注意しなければなりません.もしコンストラクタが明示的にobjectタイプのオブジェクトを返すなら、今回の予算結果は最終的にこの対象に戻ります.
    var MyClass = function(){
        this.name = 'lenhart';
        return {    //         
            name: 'anne'
        }
    };
    
    var obj = new MyClass();
    alert( obj.name );    //   :'anne'
    
    コンストラクタが明示的に任意のデータを返していない場合、または非オブジェクトタイプのデータを返しても、上記の問題は発生しません.
    var MyClass = function(){
        this.name = 'lenhart';
        return 'anne';
    }
    
    var obj = new MyClass();
    alert( obj.name );  //   :'sven'
    
    4)Function.prototype.callまたはFuntions.prototype.appy
    一般的な関数と比較して、Funtions.prototype.callまたはFuntion.prototype.applyで、着信関数のthisを動的に変更できます.
    var obj1 = {
        name: 'lenhart',
        getName: function(){
            return this.name;
        }
    }
    
    var obj2 = {
        name: 'anne'
    }
    
    alert( obj1.getName() );  //  :'lenhart'
    alert( obj1.getName.call( obj2 ) );  //  :'anne'
    
    callとapply方法はJavaScriptの関数的な言語特性をよく表しています.JavaScriptでは、関数的な言語スタイルのコードを書くたびに、callとapplyと離れられません.JavaScriptの多くのバージョンのデザインモードでも、callとappyが使われています.