JavaScriptの中のthisは問題を指します.

2940 ワード

thisの方向:
ess 5では、thisの指差は作成時に確定できるものではなく、thisは永遠に最後に呼び出される対象を指す.
   var name = "windowsName";
   function a() {
       var name = "Cherry";

       console.log(this.name);          // windowsName

       console.log("inner:" + this);    // inner: Window
   }
   a();

ここのa()はwindow.a()に相当します.だから最後のthisはずっとwindowの対象です.
var name = "windowsName";
    var a = {
        name: "Cherry",
        fn : function () {
            console.log(this.name);      // Cherry
        }
    }
    a.fn();

注:この例では、関数fnはオブジェクトaから呼び出されるので、プリントの値はaのnameの値です.
var name = "windowsName";
    var a = {
        name: "Cherry",     //        ,this.name      undefined。
        fn : function () {
            console.log(this.name);      // Cherry
        }
    }
    window.a.fn();

注:thisは常に最後にそのオブジェクトを呼び出すことを指しますので、ここでthisはまだaオブジェクトを指します.
    var name = "windowsName";
    var a = {
        name : null,
        // name: "Cherry",
        fn : function () {
            console.log(this.name);      // windowsName
        }
    }

    var f = a.fn;
    f();

注:fnはaオブジェクトに割り当てられましたが、コールされませんでした.最後はまだwindowに呼び出されました.だから、thisはwindowを指します.
どのようにthisの方向を変えますか?
  • は矢印関数を使用する.
  • は関数内部で_を使用します.this=this
  • は、appy、call、bindを使用する.
  • newはオブジェクトを具体化する.
  •     var name = "windowsName";
    
        var a = {
            name : "Cherry",
    
            func1: function () {
                console.log(this.name)     
            },
    
            func2: function () {
                setTimeout(  function () {
                    this.func1()
                },100);
            }
        };
    
        a.func2()     // this.func1 is not a function
    
    ここのsetTimeout()関数では、thisはwindowを指していますが、windowオブジェクトはfunc 1を含んでいません.
    矢印関数のthis
    矢印関数のthisは、常に関数定義時のthisを指します.実行時ではありません.矢印関数はこの文を覚えておく必要があります.「矢印関数にはthisバインディングがなく、その値は作用するドメインチェーンを検索することによって決定されなければなりません.矢印関数が矢印関数でない場合、thisバインディングされているのは一番近い矢印関数のthisです.そうでなければ、thisはundefinedです.」
        var name = "windowsName";
    
        var a = {
            name : "Cherry",
    
            func1: function () {
                console.log(this.name)     
            },
    
            func2: function () {
                setTimeout( () => {
                    this.func1()
                },100);
            }
    
        };
    
        a.func2()     // Cherry
    
    注:ここの矢印関数内のthisは常にaオブジェクトですので、エラーが発生しません.
    関数内部で_を使うthis=this
        var name = "windowsName";
    
        var a = {
    
            name : "Cherry",
    
            func1: function () {
                console.log(this.name)     
            },
    
            func2: function () {
                var _this = this;
                setTimeout( function() {
                    _this.func1()
                },100);
            }
    
        };
    
        a.func2()       // Cherry
    
    ここでthisを予め_に保存します.thisの中に入っていますので、thisはずっとaの対象を指しています.