当我执行以下javascript时,我期待b()的控制台日志打印未定义。 (因为我没有声明姓名)。
function b(){
console.log(name);
}
function a(){
var name = "rupesh";
b();
}
var name = "Demo";
a();
预期输出:未定义
实际输出:演示
我一直在阅读全局执行上下文,Javascript的执行上下文。已经提到执行上下文将查找全局执行上下文。
但如果我理解正确,函数a()和函数b()在堆栈中执行。它如何回到执行上下文(在数据结构的角度来看,这不会发生)。
有点困惑。请解释一下这是如何工作的!答案 0 :(得分:1)
当我执行以下javascript时,我期待b()的控制台日志打印未定义。 (因为我没有声明姓名)。
从技术上宣布name
是 。这就是所谓的吊装。所以,快速运动"赶上"所有var
声明并将它们置于函数之上(在您的情况下,因为它不在函数内部,它们会附加到全局命名空间)。所以,它是这样的:
var name;
function b(){
console.log(name);
}
...
现在,当a()
被调用时,name
变量已赋值,在本例中为"Demo"
。
在function a () {...}
内,您再次分配了一个名为name
的变量,但由于它前面有var
,name
不会更改全局name
(我想你已经想出来了,因为你希望name
成为undefined
)。
最后,在b()
内调用a()
时,它会查找分配了name
值的全局"Demo"
变量。
只是为了展示整个画面,那就是运行时"""你的代码:
var name;
function b(){
console.log(name);
}
function a(){
var name = "rupesh";
b();
}
name = "Demo";
a();