您可以将一些标识符传递到您的foo()
中以进行跟踪。试试这个:
setTimeout(function () { foo(1); }, 10);
setTimeout(function () { foo(2); }, 10);
并修改您的foo()
函数以接受 id 参数并将其传递。
function foo(id) {
/* some statements */
bar(id);
}
function bar(id) {
try {
throw {
name: "Exception",
message: "oooh damn!" + id
}
} catch (e) {
console.error(e.name, e.message);
}
}
请参阅小提琴中的示例:http: //jsfiddle.net/amyamy86/Am8mf/
所以,如果我这样做:
setTimeout(function () { foo(1); }, 10);
setTimeout(function () { foo(2); }, 10);
然后它又回来了:
Exception oooh damn!1
Exception oooh damn!2
或者如果我这样做:
setTimeout(function () { foo(1); }, 10);
setTimeout(function () { foo(2); }, 9);
然后它又回来了:
Exception oooh damn!2
Exception oooh damn!1
编辑 #2不必将id作为参数传递:
var currentId = null;
function foo() {
var id = currentId; // since it's copied over to 'id', we don't care about 'currentId' anymore
var bar = function() {
try {
throw {
name: "Exception",
message: "oooh damn!" + id
}
} catch (e) {
console.error(e.name, e.message);
}
}
/* some statements */
bar();
}
setTimeout(function () {
currentId = 1;
foo();
}, 10);
setTimeout(function () {
currentId = 2;
foo();
}, 10);
所以currentId
是一个共享变量,但是在结束的那一刻被设置setTimeout()
,并执行函数。
这样做:
setTimeout(function () {
currentId = 1;
foo();
}, 10);
setTimeout(function () {
currentId = 2;
foo();
}, 9);
然后它又回来了:
Exception oooh damn!2
Exception oooh damn!1