代码之家  ›  专栏  ›  技术社区  ›  vsync

函数指针变量重写的奇怪场景

  •  4
  • vsync  · 技术社区  · 11 年前

    考虑这个简单的场景:

    (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! 两次我想知道为什么不 foo 用空函数重写。 食品 显然是一个在超时回调中识别的变量,该回调指向函数。

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

    1 回复  |  直到 11 年前
        1
  •  6
  •   bardzusny    11 年前

    您正在启动 setTimeout() 函数,传递它 foo() 尽管它仍然存在 (不是空的),因此它在 setTimeout() .

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

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

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

    这里是 foo() 函数只有在变为空函数后才被访问。所以什么都得不到 console.log -ged。