116
93

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JavaScript bind,call,apply入門!

Last updated at Posted at 2015-05-18

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
これもわかりやすかったです!

116
93
1

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
  3. You can use dark theme
What you can do with signing up
116
93

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?