我的头脑旋转,有人可以解释一下javascript如何存储变量以及"执行上下文"和"执行上下文对象"?
为什么代码段会在控制台上输出以下内容:
hello参数
hello参数
var hello = 'hello is assigned';
function prison(hello) {
console.log(hello);
var hello;
console.log(hello);
}
prison('the hello argument');

谢谢!
答案 0 :(得分:2)
这与执行上下文和与函数变量范围有关的一切都没有多大关系。您将'the hello argument'
作为参数传递给函数并使用本地函数而不是在函数外部声明的hello
var。
var hello
什么都不做,如果您使用use strict
或者linter可能会发出警告(试图声明现有变量)。
如果您将其更改为var hello = null;
,您会看到输出更改。
现在,如果您有以下代码:
var hello = 'hello is assigned';
function prison() {
console.log(hello);
var hello;
console.log(hello);
}
prison();
...两个日志都会得到undefined
。这可能是由于variable hoisting - 变量声明在执行之前被移动到函数的开头 - 所以代码实际上就是这样:
function prison() {
var hello;
console.log(hello);
console.log(hello);
}
在这两种情况下, hello
都是undefined
。
答案 1 :(得分:1)
您的函数prison()
已关闭变量hello
,var hello;
中的prison()
未创建新变量,该函数可以看到已存在全局变量hello
已定义,因此它使用该变量,因此您得到2 the hello argument
但是,如果hello
之前没有prison()
定义您将获得undefined
bcoz,hello
的定义将在prison()
和hello
中提升{1}}没有设置值。