What's this

2655 ワード

What's this
実行中のバインディングの特性のため、JavaScriptのthisは、全体的なオブジェクト、現在のオブジェクト、または任意のオブジェクトとすることができ、これは関数の呼び出しに依存します.
関数を使う場合によって、thisの値が変わります.しかし、全体的な原則があります.つまり、thisとは、関数を呼び出す対象のことです.
関数として呼び出す
関数が直接呼び出された場合、thisはグローバルオブジェクトにバインドされます.ブラウザでは、Windowsはこの全体のオブジェクトです.
console.log(this);  //Window

function fn1(){
    function fn2(){
      console.log(this);
    }
}

fn1();  //Window

入れ子コール
関数ネストによって生成される内部関数のthisは、親関数ではなく、依然として大域変数である.
console.log(this);  //Window

function fn1(){
    function fn2(){
      console.log(this);
    }
    fn2()
}

fn1();  //Window
set Timeout、set Interval
documentを取得:
document.addEventListener('click', function(e){
  console.log(this);
  var _this = this;
  setTimeout(function(){
      console.log(_this);
  }, 200);
}, false);
オブジェクトメソッドとして呼び出す
JavaScriptでは、関数もオブジェクトですので、関数はオブジェクトの属性として使用できます.このとき、この関数はオブジェクトと呼ばれる方法で、このような呼び出し方式を使用すると、thisはオブジェクトに自然に結合されます.
var obj1 = {
    name: 'Byron',
    fn : function(){
        console.log(this);
    }
};

obj1.fn();//Object {name: "Byron", fn: function}

var fn2 = obj1.fn;

fn2(); //window,   window.fn2()
Function.prototype.bind
bindは、新しい関数を返し、関数内部のthisを着信の最初のパラメータにします.
document.addEventListener('click', function(e){
  console.log(this);
  setTimeout(function(){
      console.log(this);
  }.bind(this), 200);
}, false);
callとappyを使ってthisを設定します.
    var value = 100;
    var obj = {
        value: 200
    }

    function fn(a,b){
        console.log(this.value + a + b)
    }

    fn(3,4) //107

    fn.call(obj,3,4)    //207
    fn.apply(obj, [3,4])  //207
行列の最大値を求めます.
var arr = [1,3,12,3]
console.log( Math.max.apply(null, arr) )  //12
スティッチング文字列
    function joinStr(){
        //1.
        console.log( Array.prototype.join.call(arguments, '-'))
        //2.
        var join = Array.prototype.join.bind(arguments);
        console.log(join('-'))
    }

    joinStr('a','b','c')
三種類の変数
  • 例示的変数:(this)クラスのインスタンスがアクセスできる変数
  • 静的変数:(属性)直接型オブジェクトがアクセスできる変数
  • プライベート変数:(局所変数)現在のスコープ内で有効な変数
  • function ClassA(){
        var a = 1; //    ,          
        this.b = 2; //    ,        
    }
    
    ClassA.c = 3; //     ,     ,    
    
    console.log(a); // error
    console.log(ClassA.b) // undefined
    console.log(ClassA.c) //3
    
    var classa = new ClassA();
    console.log(classa.a);//undefined
    console.log(classa.b);// 2
    console.log(classa.c);//undefined