1

1)有人可以说明 setTimeout 在执行线程方面是如何工作的。

考虑:

function foo() { alert('foo'); }
function bar() { alert('bar'); }  
setTimeout(foo,1000);
bar();

或者

function foo() { alert('foo'); setTimeout(foo,1000); }
function bar() { alert('bar'); }  
setTimeout(foo,1000);
bar();

或者

function foo() { alert('foo'); setTimeout(foo,1000); }
function bar() { /* an execution that runs with unknown time */ }  
setTimeout(foo,1000);
bar();

或者

function foo() { alert('foo'); setTimeout(foo,1000); }
function bar() { /* some ajax call that reply with unknown time */ }  
setTimeout(foo,1000);
bar();

或者

function foo() { alert('foo'); setTimeout(foo,1000); }
function bar() { alert('foo'); setTimeout(bar,1000); }  
setTimeout(foo,1000);
setTimeout(bar,1000);

2)有人可以解释为什么“这个”对象在 setTimeout 中不起作用以及我们可以做些什么来解决这个问题?

4

2 回答 2

8

请阅读@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();
于 2012-12-13T23:15:20.450 回答
0

据我记得:

var me = this;
me.f();

(这可能会在另一种情况下改变其含义)。

于 2012-12-13T23:14:22.773 回答