2016-09-29 41 views
0

当我执行下面的JavaScript时,我期待b()的控制台日志打印undefined。 (因为我没有声明姓名)。Javascript调用堆栈/执行上下文参考

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

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

var name = "Demo"; 
a(); 

预期输出:未定义

实际输出:演示

我一直在阅读上的全球执行上下文,使用Javascript的执行上下文。有人提到,执行上下文将查找全局执行上下文。

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

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

+1

吊装。 http://www.adequatelygood.com/JavaScript-Scoping-and-Histing.html – Will

回答

1

当我执行下面的JavaScript,我期待b()的控制台日志打印undefined。 (因为我没有声明姓名)。

技术上name声明。这就是所谓的提升。所以,runtimer“捕捉”所有的声明并将它们放在函数的顶部(在你的情况下,因为它不在函数内部,它们被附加到全局名称空间)。因此,这将会是这样的:

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

现在,当a()被称为name变量值分配,在这种情况下"Demo"

里面function a() {...}您分配一个又打电话name变量,但因为这有var之前,即name不会改变全球name(我想你已经想通了这一点,因为你预期nameundefined )。

最后,当在a()内部调用b()时,它看起来是全局的name变量,该变量分配了"Demo"值。

只是为了展示全貌,这就是运行时如何“看到”您的代码:

var name; 

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

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

name = "Demo"; 
a(); 
+0

惊人的解释不了更好 – TechnoCorner

+0

很高兴帮助! :) –