setTimeout()の第一引数の違い

setTimeoutの第一引数を、文字列で指定するか、関数オブジェクトを渡すかの違いを調べる。

function startTest(){}の呼び出しに違いは見られないが、
obj.startTest()のように、オブジェクトメソッドを呼び出した場合にthisの内容が違っている。

objのプロパティをthis.propなどとして扱っているときにundefinedとなる可能性があるため、
オブジェクトのメソッドを呼び出す場合は文字列にする方が良いしなければならない。

なお、
function(){ obj.startTest(); } という、オブジェクトのメソッドを呼び出すための関数を第一引数にする場合は、この限りではない。


setTimeout( function(){ obj.startTest(); } , 500 );
setTimeout( 'obj.startTest();' , 500 );
この2つが(thisの内容という意味で)同等。


サンプル



コード

<script>
var start = function(){
  var ret = [
   'this==window    : ' + (this==window), 
   'this==startText : ' + (this==startTest)
  ];
  alert( ret.join('\n') );
};

<input type="button" value="'startTest();'" onclick="setTimeout('startTest();',500);">
<input type="button" value="startTest" onclick="setTimeout(startTest,500);">


var obj={prop:'hello'};
obj.start = function(){
  var ret = [
   'this==window        : ' + (this==window), 
   'this==obj           : ' + (this==obj), 
   'this==obj.startText : ' + (this==obj.startTest),
   'this.prop : ' + this.prop
  ];
  alert( ret.join('\n') );
};
</script>

<input type="button" value="'obj.startTest();'" onclick="setTimeout('obj.startTest();',500);">
<input type="button" value="obj.startTest" onclick="setTimeout(obj.startTest,500);">


BACK

© 2011, Wicker Wings