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.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。