javascript基礎:thisキーワード

2932 ワード

テーマ
パッケージ関数fは、fのthisを指定されたオブジェクトに向ける.
入力例
bindThis(function(a, b) {
    return this.test + a + b;
}, {test: 1})(2, 3);
出力例
6
分析
題目を解く
このテーマの要求は、一つの関数bindThisをカプセル化し、この関数には二つのパラメータがあり、一つのパラメータは一つの内部にthisポインタを使用する関数fがあり、二つ目のパラメータは一つのオブジェクトobjで、bindThisを実行した後、一つの関数を返します.はい、これを見たばかりの時も目まいがすると認めましたが、下のように書いたら、だいぶ良くなりましたか?
function f(a, b) {
    return this.test + a + b;
}

function bindThis(f, obj) {
    //      
}

//    
var a = bindThis(f,{test:1});
a(2,3);
何がthisですか
thisはJavascript言語のキーワードです.関数 を表し、自動的に生成された内部オブジェクトは、関数の内部でのみ使用されます.具体的には、阮一峰のJavascriptのthisの使い方と変数が違っています.キーワードthisは機能領域の制限がなく、入れ子の関数は呼び出された関数からthisを継承しません.簡単にthisの指向を四つの場合に分けます.
  • 関数呼び出し
              ,       , this        Global(      )  undefined(     )。
    
  • オブジェクト方法呼び出し
                    ,  this        .
    
  • 構築関数呼び出し
          ,               (object)。  ,this       。
    
  • bind applycal
    apply()          ,              ,                       。  ,this          。bind,call  。
    
  • まとめ:thisのキーワードは、私を呼んだ人が誰かを指します.
    解決方法
    まず、this のこのいくつかの字を見て、あなたは条件反射のがjavascriptの3剣士を思い出したのではないですか?
    bind apply callの違い
    callとapplyはいずれも、ある関数が動作するときのcontextすなわちコンテキストを変更するために存在し、換言すれば this のためである.JavaScriptの関数には「定義時文脈」と「実行時文脈」と「文脈は変えられます」という概念があるからです.
  • 同じ点:
            this。
  • 異なる点:
    call apply     :    。apply()       ,       this   ,          。  call()  ,             this   ,            ,        ,                            。
    bindの違い:新しい関数を作成します.具体的には、この文章を見てJavascriptのFunction.prototype.bind
  • を理解することができます.
    解決方法一:bind()を使う
    以下の例はその解決法の一つであり、また、bind()法が新しい関数を作成することを示している.
    function f(a, b) {
        return this.test + a + b;
    }
    
    function bindThis(f, obj) {
        //      
        return f.bind(obj);
    }
    
    //    
    var a = bindThis(f,{test:1});
    console.log(a(2,3));
    console.log(f(2,3));
    出力結果:
    6
    NaN
    解決方法2:appyを使用する()
    function bindThis(f, obj) {
        //      
        return function () {
            return f.apply(obj, arguments);
        };
    }
    ここでは関数を使ってapplyメソッドを包装し、関数を返します.argumentsは、JavaScriptのそれぞれの関数の中で特別な変数argmentsにアクセスすることができます.この変数は、この関数に伝達されるすべてのパラメータリストを維持します.
    注意:argmentsは関数内の変数として定義されています.したがって、varキーワードでargmentsを定義したり、argmentsを形式パラメータとして宣言したりすると、元のアーグメンントが作成されなくなります.
    アーグメンツ変数は配列ではありません.配列に関する属性lengthが文法的にありますが、Aray.prototypeからは引き継がれません.実際にはオブジェクトです.
    解決方法3:コールを使う()
    apply()と同様にパラメータのみの着信方式が異なります.
    function bindThis(f, obj) {
        //      
        return function (a,b) {
            return f.call(obj, a,b);
        };
    }
    締め括りをつける
    このテーマは主にthisのキーワードとthisの方向を変える方法を考察しています.才能が浅くて、このいくつかの方法しか見つけられません.しかし、javascriptという言語の柔軟性を考えると、私はいつも他の方法があると思います.ご指導をお願いいたします.