我以为我理解了范围

scr*_*key 7 javascript

有人可以告诉我为什么'x'的最后一次记录等于0而不是1.我认为因为它在函数之外声明它具有全局范围然后在函数中它的值被设置为1并且该值将保持为它的全球?我知道函数内部的第一个'x'值是全局的,因为没有var关键字声明的任何变量都成为window对象的属性.非常感谢

var x = 0; //global variable

function y(){
  x = 1;
  log("1. %n ", x);//1. 1

  var x = 2;
  log("2. %n ", x);//2. 2
}

y();
log("3. %n ", x);//3. 0
Run Code Online (Sandbox Code Playgroud)

CMS*_*CMS 6

var语句是提升的主题,当您的代码被评估时,它实际上看起来像这样:

var x = 0; //global variable
function y(){
  var x; // local!!

  x = 1;
  log("1. %n ", x);//1. 1

  x = 2;
  log("2. %n ", x);//2. 2
}

y();
log("3. %n ", x);//3. 0
Run Code Online (Sandbox Code Playgroud)

y执行之前,设置新的执行上下文,并且在执行函数之前执行变量实例化过程.

这就是为什么JSLint每个函数只推荐一个var语句,以模仿实际发生的情况的原因之一.


Gum*_*mbo 5

x函数内部的变量是在执行函数时立即创建的,而不仅仅是在到达带有变量语句的行时:

如果变量语句出现在FunctionDeclaration中,则变量在该函数[...]中使用函数局部范围定义.输入执行范围时会创建变量.[...]变量在创建时初始化为未定义.[...]

您可以看到x最初undefinedlog第一个作业之前添加呼叫时:

function y(){
  log("0. " + x);//0. undefined
  x = 1;
  log("1. " + x);//1. 1
  var x = 2;
  log("2. " + x);//2. 2
}
Run Code Online (Sandbox Code Playgroud)

这意味着函数内的两个赋值都x在函数局部范围内引用,而不是x在全局范围内.