在学习JS期间,以下代码对我来说是个神秘的事物。
以下代码永远不会打印出“这是fn”?
我不确定fn=null;
总是在的回调函数之前首先被调用
setTimtout(..,0)
function fn(){
console.log('this is fn');
}
var intv = setTimeout( function(){
intv = null;
if (fn) fn();
}, 0 );
fn = null;
答案 0 :(得分:2)
因为这就是它的工作方式。 setTimeout
的回调函数将被推入队列,直到堆栈变空。
分配fn = null;
后,堆栈将变空。
现在,事件循环将把回调推入堆栈,因为它将为空,因此它将执行,并且由于fn
不再是一个函数,而是null,所以不会执行任何console.log
。 / p>
答案 1 :(得分:2)
在以下情况下,超时将无法运行该功能
:所以你:
fm
设置为空在此阶段,事件循环不再忙碌。
如果没有超过最小超时时间,那么JS会稍等。
然后调用该函数。
fn
是null
。
答案 2 :(得分:1)
您需要了解JavaScript如何执行任何功能。该数据结构称为“调用堆栈”
调用堆栈:-它是一个数据结构,用于记录函数调用,基本上是我们在程序中的位置。如果我们调用一个函数 execute,我们将东西压入堆栈,当我们从 功能,我们从堆栈顶部弹出。
在您的情况下,完整脚本本身就是第一个调用,我们可以将其称为main。
所以堆栈中的第一个条目是
function fn(){
console.log('this is fn');
}
var intv = setTimeout( function(){
intv = null;
if (fn) fn();
}, 0 );
fn = null;
在该代码中,设置的超时是执行第一个条目之后的第二次调用。
var intv = setTimeout( function(){
intv = null;
if (fn) fn();
}, 0 );
现在,JavaScript调用堆栈将执行第一个条目,该条目在最后一行将fn的值设置为null。
然后它将执行超时间隔函数,其中fn为null。如果(fn)返回false,则什么也不会执行。