setTimeout的执行上下文(JavaScript)

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(); (这可能会改变它在另一个上下文中的含义)。

1) 有人能从执行线程的角度说明setTimeout是如何工作的吗

考虑:

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的,但答案被版主删除了,希望提供这种评论是合适的。最后一种方法很有趣