堆栈+变量行为

时间:2014-03-17 18:13:44

标签: javascript stack

我对理解堆栈执行和变量只有一点点困惑。以下是代码。

  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>

1 个答案:

答案 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());