Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 函数指针变量重写的奇怪场景_Javascript - Fatal编程技术网

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

Javascript 函数指针变量重写的奇怪场景,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, a

考虑以下简单场景:

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

这个问题的枯燥背景:

这是一个简单的测试用例,用于我面临的更复杂的场景,使用AJAX回调,而不是这个简单示例中使用的超时

您正在立即启动
setTimeout()
函数,在它仍然存在(不是空的)时传递它
foo()
,因此它实际上在
setTimeout()的范围内稍后才可用

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

setTimeout(function () {
    foo();
}, 100);
(小提琴:)


这里的
foo()
函数只有在变为空函数后才能访问。所以没有什么东西会变得有趣。我一直认为传递的是指针,而不是函数本身。遗憾的是,这并没有解决我真正的问题,它没有使用任何
setTimeout
…甚至更奇怪。不,事实上,这个发现确实帮助了我!在编写js代码10年后才知道这一点,真是太疯狂了。