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

时间:2016-03-23 12:58:48

标签: javascript function global-variables

我的头脑旋转,有人可以解释一下javascript如何存储变量以及"执行上下文"和"执行上下文对象"?

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

  

hello参数

     

hello参数



var hello = 'hello is assigned';

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




谢谢!

2 个答案:

答案 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()已关闭变量hellovar hello;中的prison()未创建新变量,该函数可以看到已存在全局变量hello已定义,因此它使用该变量,因此您得到2 the hello argument

但是,如果hello之前没有prison()定义您将获得undefined bcoz,hello的定义将在prison()hello中提升{1}}没有设置值。