我对理解堆栈执行和变量只有一点点困惑。以下是代码。
var getDetails=false;
function firstFunction(){
getDetails=true;
// ajax call
}
function secondFunction(){
getDetails=false;
subFunction();
}
fucntion subFunction(){
if(getDetails){
}
}
正如您注意到有一个全局变量,我在第一个和第二个函数中设置全局变量的值,并在我的subFucntion中使用它。
现在让我说我调用fistFunction(这个函数调用ajax并且稍微得到数据)。 现在当fistFunction正在执行时,我将第二个函数,我正在改变全局变量,我也调用使用全局变量的subFucntion。现在假设当子函数执行时,即使我的FirstFunction也执行全局变量的值? / p>
答案 0 :(得分:1)
在上面的代码中,当您致电getDetails
时,false
肯定是subFunction
,因为您在致电false
之前立即将其设置为subFunction
。
您对Javascript的工作方式存在误解:
当子功能正在执行时,我的FirstFunction也在执行
这种情况不会发生。
Javascript是单线程的,因此一次只能执行一个函数。与setTimeout类似,AJAX调用是异步的,但回调函数只会在您的其他执行路径完成后执行,这是响应准备好后线程可用的最早点。如果线程忙于执行另一个函数,那么在完成后回调将不会运行。
试试这个例子:
var start = new Date().getTime();
// Logs first
console.log('Start time: ', start);
// Asynchronous, but still won't run until after the spin lock finishes
// A result of Javascript being single-threaded
setTimeout(function(){
// Logs last
console.log('Asynchronous callback time: ', new Date().getTime());
}, 500);
// Two second spin-lock
while(start + 2000 > new Date().getTime());
// Logs second
console.log('Spin lock finished', new Date().getTime());