javascript - 函数指针变量覆盖的奇怪场景

标签 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! 两次。我试图理解为什么 foo 不会被空函数覆盖。 foo 显然是一个在超时回调中被识别的变量,它指向函数。

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

最佳答案

你马上启动 setTimeout() 函数,将它传递给 foo() 当它仍然存在时(不是空的),因此它实际上稍后可用,在 setTimeout() 的范围内。

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

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

( fiddle :http://jsfiddle.net/0p7fgsso/)

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

关于javascript - 函数指针变量覆盖的奇怪场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28169737/

相关文章:

javascript - d3.js -- 轴标签帮助(从 v3 到 v4)

javascript - 下拉菜单中所选值的不同显示

javascript - !function() { return false; 的操作细节} ()

javascript - 使 <li> 元素比包含的 <ul> 元素拉伸(stretch)得更宽

javascript - react native : How to set <TextInput/>'s height and width to <View/> container?

javascript - 使用 ng build --prod 后 Angular2 无法看到图像

javascript - Google Charts - 获取特定值

javascript - 为什么参数没有以 Angular 形式传入resolved?

javascript - Protractor - 如何处理大量动画的网站?

javascript - 正则表达式匹配由点分隔的字符串,只能包含字母数字、连字符、下划线、点