忍者ブログ

23Apr

[PR]

Posted by in

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

29Jun

bind

Posted by No Name Ninja in 便利な技

bind関数で「thisとは何か」を明確化することができる。javascriptの関数は全てthisを持っているが、新たに導入されたオブジェクト指向のthisと混合してしまうことがあり、実行時に明確化しないといけないときがある。ただ、使い方によっては、「汎用的な関数を作る」ために大きな助けとなるため、覚えておいたほうがよい。
●パターン1・・・イベント実行時、thisが何を指すか明確化する。
SAMPLE

<script language="javascript" type="text/javascript">

//クラスDogを定義
function Dog(name,speed,bark){
  this.name = name;
  this.speed = speed;
  this.bark = bark;

  this.barking = function(){
    alert(this.name + ' is barking "' + this.bark + '"');
  }

  this.running = function(){
    alert(this.name + ' is runnning "' + this.speed + '"');
  }
}

//定期的にdog.barkingを実行する。
var dog = new Dog('taro',10,'わんわん');
setTimeout(dog.barking.bind(dog),2000);


//bind実装されていないブラウザ向け
if(!Function.bind){
  Function.prototype.bind = function(scope){
    var _function = this;
    return function(){
      return _function.apply(scope,arguments);
    };
  }
}

</script>

setTimeoutが実行された場合、thisは、windowオブジェクトとなる。そのため、たとえクラスであってもbindを実行してthisを明確化しないといけない。




●パターン2・・・thisを束縛することで汎用的な関数を作ることができる。
onclickなどイベントで呼ばれる関数内のthisは、そのイベント実行した要素オブジェクトとなるが、bindでthisを変更することができる。関数の外で指定することができるので、汎用的な関数を作りやすくなる。
SAMPLE

<script language="javascript" type="text/javascript">

onload=function(){
  //ボタンのonclickイベントをテキストオブジェクトに変更する。
  document.forms['testForm'].elements['testButton'].onclick=alertThis.bind(document.forms['testForm'].elements['testText']);
}

function alertThis(e){
  alert(this.value);
}

//bind実装されていないブラウザ向け
if(!Function.bind){
  Function.prototype.bind = function(scope){
    var _function = this;
    return function(){
      return _function.apply(scope,arguments);
    };
  }
}
</script>



PR

Comment


Vodafone絵文字 i-mode絵文字 Ezweb絵文字

Trackback