Javascript调用堆栈/执行上下文参考

时间:2016-09-29 21:53:12

标签: javascript

当我执行以下javascript时,我期待b()的控制台日志打印未定义。 (因为我没有声明姓名)。

function b(){
    console.log(name);
}

function a(){
    var name = "rupesh";
    b();
}

var name = "Demo";
a();
  

预期输出:未定义

     

实际输出:演示

我一直在阅读全局执行上下文,Javascript的执行上下文。已经提到执行上下文将查找全局执行上下文。

但如果我理解正确,函数a()和函数b()在堆栈中执行。它如何回到执行上下文(在数据结构的角度来看,这不会发生)。

有点困惑。请解释一下这是如何工作的!

1 个答案:

答案 0 :(得分:1)

  

当我执行以下javascript时,我期待b()的控制台日志打印未定义。 (因为我没有声明姓名)。

从技术上宣布name 。这就是所谓的吊装。所以,快速运动"赶上"所有var声明并将它们置于函数之上(在您的情况下,因为它不在函数内部,它们会附加到全局命名空间)。所以,它是这样的:

var name;
function b(){
   console.log(name);
}
...

现在,当a()被调用时,name变量已赋值,在本例中为"Demo"

function a () {...}内,您再次分配了一个名为name的变量,但由于它前面有varname不会更改全局name (我想你已经想出来了,因为你希望name成为undefined)。

最后,在b()内调用a()时,它会查找分配了name值的全局"Demo"变量。

只是为了展示整个画面,那就是运行时"""你的代码:

var name;

function b(){
  console.log(name);
 }

 function a(){
   var name = "rupesh";
   b();
 }

 name = "Demo";
 a();