考虑这个简单的场景:
(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
{{1}}显然是一个变量,它在超时回调中被识别,指向该函数。
无聊的背景:
这是一个简单的测试用例,用于我使用AJAX回调而不是在这个简单示例中使用的超时的更复杂场景。
答案 0 :(得分:6)
您立即启动setTimeout()
功能,在foo()
仍然存在时将其传递(非空),因此它实际上可以在以后使用, setTimeout()
。
快速演示以达到预期效果:
setTimeout(function () {
foo();
}, 100);
(小提琴:http://jsfiddle.net/0p7fgsso/)
此处foo()
函数只有在变为空函数后才会被访问。所以没有任何东西得到console.log
- ged。