Javascript中的执行上下文和执行上下文对象

Javascript中的执行上下文和执行上下文对象,javascript,function,global-variables,Javascript,Function,Global Variables,我的脑子在转,有人能解释一下javascript是如何存储变量的,什么是“执行上下文”和“执行上下文对象”吗 为什么代码段会在控制台上打印以下输出: hello论点 hello论点 var hello='hello已分配'; 功能监狱(你好){ console.log(hello); 你好; console.log(hello); } 监狱(“你好的争论”)您的函数savilion()在变量hello上有闭包,var hello在监狱()中没有创建新变量,函数可以看到已经定义了一个全局变量he

我的脑子在转,有人能解释一下javascript是如何存储变量的,什么是“执行上下文”和“执行上下文对象”吗

为什么代码段会在控制台上打印以下输出:

hello论点

hello论点

var hello='hello已分配';
功能监狱(你好){
console.log(hello);
你好;
console.log(hello);
}
监狱(“你好的争论”)您的函数
savilion()
在变量
hello
上有闭包,
var hello
监狱()
中没有创建新变量,函数可以看到已经定义了一个全局变量
hello
,因此它使用该变量,因此得到2个
hello参数

但是,如果在
监狱()
之前没有定义
你好
,您将得到2个
未定义的
bcoz
你好
的定义将被提升到
监狱()
并且
你好
没有设置值。

您的函数
监狱()
对变量
你好
有闭包,
var-hello
监狱()
中没有创建新变量,函数可以看到已经定义了一个全局变量
hello
,因此它使用该变量,因此得到2个
hello参数


但是,如果在
监狱()之前没有定义
hello
,您将得到2个
未定义的
bcoz
hello
的定义将在
监狱()中悬挂
hello
没有设置值。

这与执行上下文关系不大,而与函数变量范围有关。您将
'hello参数'
作为参数传递给函数,并且作为本地参数,它被用来代替在函数外部声明的
hello
变量

var hello
不执行任何操作,如果使用
use strict
或linter,则可能会发出警告(试图声明现有变量)

如果将其更改为
var hello=null您将看到输出的更改

现在,如果您有以下代码:

var hello = 'hello is assigned';

function prison() {
  console.log(hello);
  var hello;
  console.log(hello);
}

prison();
…对于这两个日志,您将得到
未定义的
。这可能是由于-变量声明在执行之前被移动到函数的开头-因此代码实际上看起来是这样的:

function prison() {
  var hello;
  console.log(hello);
  console.log(hello);
}

hello
在这两种情况下都是
未定义的

这与执行上下文关系不大,与函数变量范围有关。您将
'hello参数'
作为参数传递给函数,并且作为本地参数,它被用来代替在函数外部声明的
hello
变量

var hello
不执行任何操作,如果使用
use strict
或linter,则可能会发出警告(试图声明现有变量)

如果将其更改为
var hello=null您将看到输出的更改

现在,如果您有以下代码:

var hello = 'hello is assigned';

function prison() {
  console.log(hello);
  var hello;
  console.log(hello);
}

prison();
…对于这两个日志,您将得到
未定义的
。这可能是由于-变量声明在执行之前被移动到函数的开头-因此代码实际上看起来是这样的:

function prison() {
  var hello;
  console.log(hello);
  console.log(hello);
}
hello
在这两种情况下都是
未定义的