奇怪的情况是函数指针变量覆盖

时间:2015-01-27 11:46:19

标签: javascript

考虑这个简单的场景:

(function x(){
  var foo = function(){
    console.log('foo is alive!');

    // set 'foo' variable to an empty function, using a delay
    setTimeout(function(){
      foo = function(){};
    },0);
  }

  foo();
  // calling 'foo' again, after it should be an empty function
  setTimeout(foo,100);
})();

如果要在控制台中复制并运行此代码,则会输出foo is alive!两次。我试图理解为什么不会用空函数覆盖foofoo {{1}}显然是一个变量,它在超时回调中被识别,指向该函数。

无聊的背景:
这是一个简单的测试用例,用于我使用AJAX回调而不是在这个简单示例中使用的超时的更复杂场景。

1 个答案:

答案 0 :(得分:6)

您立即启动setTimeout()功能,在foo() 仍然存在时将其传递(非空),因此它实际上可以在以后使用, setTimeout()

的范围

快速演示以达到预期效果:

setTimeout(function () {
    foo();
}, 100);

(小提琴:http://jsfiddle.net/0p7fgsso/

此处foo()函数只有在变为空函数后才会被访问。所以没有任何东西得到console.log - ged。