jsの中でcall、appy、bindの方法の使用

1932 ワード

javascriptでは、callとapplyはいずれも関数の実行時のコンテキストを変えるために存在し、換言すれば、関数体内部のthisの指向を変えるためである.
JavaScriptの大きな特徴は、関数には「定義時文脈」と「実行時文脈」と「文脈は変えられます」という概念があります.
applyとcallの両方にとって、役割は全く同じです.ただパラメータを受け取る方式は違います.例えば、次のような関数の定義があります.
var func = function(arg1, arg2) {
};
以下のように呼び出すことができます.
func.call(this, arg1, arg2);
  
func.apply(this, [arg1, arg2]);
この中のthisはあなたが指定したいコンテキストです.JavaScriptのオブジェクトはどれでもいいです.callはパラメータを順番に渡す必要があります.例:
function fruits() {
  this.color = "red";
}
fruits.prototype = {
  say: function() {
    console.log("My color is " + this.color);
  }
}
var apple = new fruits;
apple.say();    //My color is red
そして:
banana = {
  color: "yellow"
}
apple.say.call(banana);     //My color is yellow
apple.say.apply(banana);    //My color is yellow
この特徴を利用すれば、継承が可能です.
コードは以下の通りです.
/*  */
function Parent(add,net,no,teacher) {
    this.add = add;
    this.net = net;
    this.no = no;
    this.teacher = teacher
}
/*  */
function Child(name,age,sex,id) {
    this.name = name;
    this.sex = sex;
    this.age = age;
    this.id = id;
    Parent.call(this,"  ","www.baidu.com","1608","ccy"); 
   //     Parent  this   Child   
}

var child = new Child("fangMing","18"," ","10086");
console.log(child.add);
bind()の最も簡単な使い方は、関数を作成して、この関数をどのように呼び出しても同じthis値があるようにします.
this.num = 9; 
var mymodule = {
  num: 81,
  getNum: function() { 
    console.log(this.num);
  }
};

mymodule.getNum(); // 81

var getNum = mymodule.getNum;
getNum(); // 9,         ,"this"      

var boundGetNum = getNum.bind(mymodule);
boundGetNum(); // 81
bind()方法はappyやcallに似ています.関数の内側にあるthisの方向を変えることもできます.
MDNの説明では、bind()方法は、バインディング関数と呼ばれる新しい関数を作成します.このバインディング関数を呼び出すと、バインディング関数が作成されたときにbind()方法の最初のパラメータをthisとして入力します.