setTimeout的执行上下文(JavaScript)
1) 有人能从执行线程的角度说明setTimeout是如何工作的吗 考虑:setTimeout的执行上下文(JavaScript),javascript,settimeout,Javascript,Settimeout,1) 有人能从执行线程的角度说明setTimeout是如何工作的吗 考虑: function foo() { alert('foo'); } function bar() { alert('bar'); } setTimeout(foo,1000); bar(); 或 或 或 或 2) 有人能解释一下为什么“this”对象在setTimeout中不工作,以及我们能做些什么来解决这个问题吗?据我所知: var me = this; me.f(); (这可能会改变它在另一个上下文中的含义)。
function foo() { alert('foo'); }
function bar() { alert('bar'); }
setTimeout(foo,1000);
bar();
或
或
或
或
2) 有人能解释一下为什么“this”对象在setTimeout中不工作,以及我们能做些什么来解决这个问题吗?据我所知:
var me = this;
me.f();
(这可能会改变它在另一个上下文中的含义)。据我记忆所及:
var me = this;
me.f();
(这可能会改变它在另一个上下文中的含义)。一定要阅读@DaveAnderson推荐的文章 至于其他内容,setTimeout/setInterval有两种形式:
setTimeout(arg, timeout)
如果arg是一个字符串,那么它将被视为要执行的源代码。这和eval()一样糟糕。避免它
如果arg是一个函数,那么它将在全局上下文中执行:
var Test = function () {
this.x = 1;
setTimeout(function () {
console.log('x: ' + this.x);
}, 10);
};
var t = new Test();
打印x:未定义
所以你想做的是:
function foo() { alert('foo'); }
setTimeout('foo()', 1000);
或者更好:
setTimeout(foo, 1000);
要修复函数的上下文,请使用bind方法:
var Test = function () {
this.x = 1;
var f = function () {
console.log('x: ' + this.x);
};
setTimeout(f.bind(this), 10); // use this as the context
};
var t = new Test();
或者手动操作:
var Test = function () {
this.x = 1;
var that = this;
setTimeout(function () {
console.log('x: ' + that.x); // closure: closing over that
}, 10);
};
var t = new Test();
一定要阅读@DaveAnderson推荐的文章 至于其他内容,setTimeout/setInterval有两种形式:
setTimeout(arg, timeout)
如果arg是一个字符串,那么它将被视为要执行的源代码。这和eval()一样糟糕。避免它
如果arg是一个函数,那么它将在全局上下文中执行:
var Test = function () {
this.x = 1;
setTimeout(function () {
console.log('x: ' + this.x);
}, 10);
};
var t = new Test();
打印x:未定义
所以你想做的是:
function foo() { alert('foo'); }
setTimeout('foo()', 1000);
或者更好:
setTimeout(foo, 1000);
要修复函数的上下文,请使用bind方法:
var Test = function () {
this.x = 1;
var f = function () {
console.log('x: ' + this.x);
};
setTimeout(f.bind(this), 10); // use this as the context
};
var t = new Test();
或者手动操作:
var Test = function () {
this.x = 1;
var that = this;
setTimeout(function () {
console.log('x: ' + that.x); // closure: closing over that
}, 10);
};
var t = new Test();
所有这些对setTimeout的调用都不会起任何作用。您将“foo”作为字符串传递,这将被解释为您需要一个函数,其主体看起来像字符串内容。请查看MDN:
setTimeout
的上下文是window
,使用函数缓存中的this
。1)您收到警告条,然后是foo。2) 你被提醒酒吧,然后foo每秒钟。然而,setInterval(foo,100)
会做得更好。3) bar完全执行,10秒后foo执行。计时器将某物推送到优先级队列的底部。4) 同样,foo将一直等到bar完成执行。所有对setTimeout的调用都不会起任何作用。您将“foo”作为字符串传递,这将被解释为您需要一个函数,其主体看起来像字符串内容。请查看MDN:setTimeout
的上下文是window
,使用函数缓存中的this
。1)您收到警告条,然后是foo。2) 你被提醒酒吧,然后foo每秒钟。然而,setInterval(foo,100)
会做得更好。3) bar完全执行,10秒后foo执行。计时器将某物推送到优先级队列的底部。4) 同样,foo将等待bar完成执行。概念上是的,但请填写函数表达式和对setTimeout
的调用。概念上是的,但请填写函数表达式和对setTimeout
的调用。我建议的文章是John Resig的,但答案被主持人删除了,最后一种方法很有趣我建议的文章是John Resig的,但答案被版主删除了,希望提供这种评论是合适的。最后一种方法很有趣