setTimeoutのコールバック関数に引数を渡すときの注意点のメモ。
» jsFiddle
var x = 'global'; function callback1() { console.log('x: ' + x); }; (function () { setTimeout(callback1, 500); // 正常 xはglobal setTimeout("callback1()", 1000); // 正常 xはglobal }());
(function () { var x = 'local'; function callback2() { console.log('x: ' + x); } setTimeout(callback2, 1500); // 正常 xはlocal // setTimeout("callback2()", 1500); // エラー発生 callback2 is not defined }());
var o = { x: 'property', callback3: function () { console.log('x: ' + this.x); // thisはwindowオブジェクト }, run: function () { setTimeout(this.callback3, 2000); // xはglobal } }; o.run(); // xはglobal
引数を渡すときは下記の記事で紹介されている方法を使うと良い。
http://wiz-code.digick.jp/blog/?p=711
function curryTimerCallback() { var userFunc = arguments[0], args = Array.prototype.slice.call(arguments, 1); // var a = ['a', 'b', 'c']; // console.log(a.slice(1)); // ['b', 'c'] return function() { return userFunc.apply(this, args); }; } var o2 = { x: 'property', callback4: function (arg) { console.log('x: ' + arg.x); }, run2: function () { setTimeout(curryTimerCallback(this.callback4, this), 2500); } }; o2.run2(); // xはproperty
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。