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年后才知道这一点,真是太疯狂了。