search
LoginSignup
90

More than 3 years have passed since last update.

posted at

updated at

JavaScript bind,call,apply入門!

Js特訓中、標題の件で悩んだのでメモります。

bind,call,applyは
簡単に言うと なりすましができます。
持ってない機能を使えます

「thisの値を束縛する。」
「レシーバーオブジェクトを変更する。」なんて言うそうです。

具体例として下記コードで ペンギンに空を飛ばせます。

penguinFly.js
// ペンギンくん
var Penguin = {
    name: 'ペンギン',
};

// 鷹
var Falcon = {
    name: '',
    fly: function(){
        console.log(this.name + 'が大空を飛びました');
    }
};

Falcon.fly();  // '鷹が大空を飛びました

鷹は空を飛べるので、flyという関数を持っています。
ではまず、callとbindを使ってペンギンに空を飛ばせます。

penguinFly.js

// call 
Falcon.fly.call(Penguin); // ペンギンが大空を飛びました

// bind は一旦変数にしまって使う
var flyPenguin = Falcon.fly.bind(Penguin); 
flyPenguin(); // ペンギンが大空を飛びました

第一引数にthisにしたい値を入れて使います。
下記のように使うと引数を渡すこともできます。

penguinFly.js
// 引数ありバージョンに変更
Falcon.fly = function(aComment){
    console.log(this.name + '' + aComment + '大空を飛びました');
}

// call
Falcon.fly.call(Penguin, '元気よく');
// ペンギンが元気よく大空を飛びました

// bind
var flyPenguin = Falcon.fly.bind(Penguin, '元気よく');
flyPenguin();
// ペンギンが元気よく大空を飛びました

applyは基本的に使い方は同じですが、配列を渡せます。

penguinFly.js
Falcon.fly = function(comment1, comment2){
    console.log(this.name + '' + comment1 + comment2 + '大空を飛びました');
}

//call
Falcon.fly.call(Penguin, '思い切って', '元気よく');
// ペンギンが思い切って元気よく大空を飛びました

// apply 
Falcon.fly.apply(Penguin, ['思い切って', '元気よく']);
// ペンギンが思い切って元気よく大空を飛びました

以上です、
変なとこあったらご指摘ください〜
http://qiita.com/setzz/items/155af03120a330fd4437
これもわかりやすかったです!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
90