thisの方向を変更します.

8905 ワード

thisの指向
ES 5では、thisは、最後にそのオブジェクトを呼び出すことを永遠に指します.
thisは永遠に最後にそのオブジェクトを呼び出します.ここで呼び出したオブジェクトはwindowです.
        var name="windowsName";
        function a(){
            var name="Cherry";
            console.log(this.name); //windowsName
            console.log("inner:"+this);//window
        }
        a();
        console.log("outer:"+this);//window
ここで呼び出したオブジェクトはaです.
var name="windowsName";
var a={
name:"Cherry",
fn:function(){
console.log(this.name); //Cherry
}
}
a.fn();
window.a.fn();
ここで関数を呼び出すオブジェクトは依然としてaですが、aのnameは定義されていませんので、undefinedです.
var name="windowsName";
    var a={
            //name:"Cherry",
            fn:function(){
                console.log(this.name); //Cherry
            }
        }
    a.fn();
    window.a.fn();
ここではaオブジェクトのfnメソッドを変数fに割り当てましたが、呼び出しがないので、fnはまだwindowで呼び出されています.
var name="windowsName";
    var a={
            name:"Cherry",
            fn:function(){
                console.log(this.name); //windowsName
            }
        }
        var f=a.fn;
        f();
thisの向きを変える
  • ES 6矢印関数
  • を使用する.
  • は関数内部で_を使用します.this=this
  • appy call bind
  • を使用する.
  • *new一例示オブジェクト
  • 1 ES 6矢印関数を使用する
    矢印ではなく、最後にsetTimeoutを呼び出すオブジェクトはwindowですが、windowにはFnc 1関数がありません.
        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
    矢印関数を使用して、矢印関数のthisは常に関数定義時のthisを指します.実行時のものではなく、「矢印関数にthisバインディングがなく、作用するドメインチェーンを検索してその値を決定しなければなりません.矢印関数が非矢印関数に含まれている場合、thisは一番近い矢印関数のthisで結合されます.さもなければ、thisはundefinedです.」
    2関数内部で_を使うthis=thisは先にこの関数を呼び出すオブジェクトを変数_に保存します.thisでは、関数でこの_を使います.this、thisは変わりません.
    var name="windowsName";
        var a={
            name:"Cherry",
            fun1:function(){
                console.log(this.name);
            },
            fun2:function(){
                var _this=this;
                setTimeout(function(){
                    _this.fun1();
                },100);
            }
        };
        a.fun2();  //Cherry
    fun 2に、_を設定しますthis=this、ここでのthisはfun 2のオブジェクトaを呼び出して、fun 2の中のsetTimeoutがwindowに呼び出されるのを防ぐために、set Timeoutの中のthisはwindowで、this(変数aを指す)を変数に割り当てます.this、このように、fun 2で_を使います.thisは対象aを指します.
    3 appy call bindを使う
    アプリを使って、thisの方向を変えます.
        var name="windowsName";
        var a={
            name:"Cherry",
            fun1:function(){
                console.log(this.name);
            },
            fun2:function(){
                setTimeout(function(){
                    this.fun1();
                }.apply(a),100);
            }
        };
        a.fun2(); 
    コールを使う
        var name="windowsName";
        var a={
            name:"Cherry",
            fun1:function(){
                console.log(this.name);
            },
            fun2:function(){
                setTimeout(function(){
                    this.fun1();
                }.call(a),100);
            }
        };
        a.fun2(); 
    ビッドを使う
    var name="windowsName";
        var a={
            name:"Cherry",
            fun1:function(){
                console.log(this.name);
            },
            fun2:function(){
                setTimeout(function(){
                    this.fun1();
                }.bind(a)(),100);
            }
        };
        a.fun2(); 
    
    callとappylの違いは、基本的に似ています.知識が入ってきたパラメータは、異なるcallでいくつかのパラメータリストを受け取り、applyは複数のパラメータを含む配列を受け入れることができます.
    var a={
            name :"Cherry",
            fn:function(a,b){
                console.log(a+b)
            }
        }
        var b=a.fn;
        b.apply(a,[1,2]);
        var a={
            name :"Cherry",
            fn:function(a,b){
                console.log(a+b)
            }
        }
        var b=a.fn;
        b.call(a,1,2);