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

vsy*_*ync 4 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);
})();
Run Code Online (Sandbox Code Playgroud)

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

对这个问题
感到无聊:这是一个简单的测试案例,用于我使用AJAX回调而不是在这个简单示例中使用的超时的更复杂场景.

bar*_*sny 6

你正在启动setTimeout()函数,foo() 当它仍然存在时传递它(不是空的),因此它实际上可以在以后的范围内使用setTimeout().

快速演示以实现您的预​​期结果:

setTimeout(function () {
    foo();
}, 100);
Run Code Online (Sandbox Code Playgroud)

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

这里foo()只有在它成为空函数后才能访问该函数.所以什么都没有console.log.