考虑这个简单的场景:
(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/