setTimeout的范围

时间:2011-04-14 03:45:13

标签: javascript scope settimeout

假设我有一个像这样的JS代码

var num = 0;

function foo(input){
   num = input;

}


function bar(){
  setTimeout(foo(2), 100);//1

  setTimeout(function(){foo(5);},100);//2

  alert("num =" + num);//3

}

使用1和3 ..... 2和3的结果...我有结果但不能理解行为...任何帮助将得到详细解释赞赏.. 。

1 个答案:

答案 0 :(得分:5)

这不是“范围”的问题,而是时间问题。

  1. num设置为2会产生副作用。foo(2)立即执行 并将结果(垃圾)传递给{{1 }}。 (也就是说,setTimeout 超时回调中作为/运行。)

  2. 在约100毫秒后调用foo(2)。匿名函数充当回调函数,后者又会调用foo(5),这会产生向foo(5)分配5的副作用。

  3. 立即提醒 。该值将为“num = 2”,因为num现在 (好吧,就在之前;-)但回调中的foo(2)将会稍后运行 (因此没有机会设置foo(5))。

  4. 快乐的编码。