Javascript 不要将和var混合在代码中。使用一个或另一个,否则你会把自己搞糊涂,除非你确切知道自己在做什么。如果你在代码中用不同的名称命名变量,可能会更清楚一些。例如x1和x2。“那时发生的事情将变得非常清楚。”弗拉兹我100%同意,但我不认为这是混乱的根源。我很确定

Javascript 不要将和var混合在代码中。使用一个或另一个,否则你会把自己搞糊涂,除非你确切知道自己在做什么。如果你在代码中用不同的名称命名变量,可能会更清楚一些。例如x1和x2。“那时发生的事情将变得非常清楚。”弗拉兹我100%同意,但我不认为这是混乱的根源。我很确定,javascript,Javascript,不要将和var混合在代码中。使用一个或另一个,否则你会把自己搞糊涂,除非你确切知道自己在做什么。如果你在代码中用不同的名称命名变量,可能会更清楚一些。例如x1和x2。“那时发生的事情将变得非常清楚。”弗拉兹我100%同意,但我不认为这是混乱的根源。我很确定OP认为,x在提供的每一行示例代码中都是相同的变量。事实上,我同意。我只是想,如果你发布一个变量名称不同的示例,一眼就能理解它会更容易一些。@Andrew我想是的,所以我很困惑,我从一个全局变量开始,然后进入if块,尝试更改局部范围的值。我想我



不要将
var
混合在代码中。使用一个或另一个,否则你会把自己搞糊涂,除非你确切知道自己在做什么。如果你在代码中用不同的名称命名变量,可能会更清楚一些。例如
x1
x2
。“那时发生的事情将变得非常清楚。”弗拉兹我100%同意,但我不认为这是混乱的根源。我很确定OP认为,
x
在提供的每一行示例代码中都是相同的变量。事实上,我同意。我只是想,如果你发布一个变量名称不同的示例,一眼就能理解它会更容易一些。@Andrew我想是的,所以我很困惑,我从一个全局变量开始,然后进入if块,尝试更改局部范围的值。我想我犯的错误是我把它当作一个单一的变量,而实际上有两个变量。我想可以得出这样的结论:一旦变量被创建,就不能更改它的范围?再次感谢大家@是的,这是正确的。但正如您所看到的,当您使用相同的变量名切换声明时,范围可能会被覆盖。这就是为什么很多过梁不允许您使用“阴影变量”。阴影变量是在函数中声明的同名变量。另外,不要在代码中混用
var
。使用一个或另一个,否则你会把自己搞糊涂,除非你确切知道自己在做什么。这不是真的<代码>让
未吊装。这就是抛出错误的原因
let
声明被挂起,其初始化未被挂起,这就是抛出错误的原因:@Francesco No。它是用
var
挂起的,但不是
let
——否则它将打印“未定义”。试着运行你的代码,它会给出一个不同于OP的结果“提升在
let
中不存在,因为使用
var
时,提升和初始化之间没有界限,因此提升是传达这一概念的最简单方式。初始化vs提升是一个教科书式的解释,为了新手,说“提升不会发生”是传达这个概念的最好方式@mpen Francesco在技术上是正确的。对不起,我应该更清楚。。。它被“吊起来”的意思是,仅仅把“放下”再往下一点就会导致错误。我们实际上有三件事,但我不确定正确的术语。有“声明”(x是一个存在的东西,总是挂起),“初始化”(将x设置为未定义,使用var挂起,但不使用let/const)和“赋值”(将x设置为false,从不挂起)这是不正确的<代码>让
未吊装。这就是抛出错误的原因
let
声明被挂起,其初始化未被挂起,这就是抛出错误的原因:@Francesco No。它是用
var
挂起的,但不是
let
——否则它将打印“未定义”。试着运行你的代码,它会给出一个不同于OP的结果“提升在
let
中不存在,因为使用
var
时,提升和初始化之间没有界限,因此提升是传达这一概念的最简单方式。初始化vs提升是一个教科书式的解释,为了新手,说“提升不会发生”是传达这个概念的最好方式@mpen Francesco在技术上是正确的。对不起,我应该更清楚。。。它被“吊起来”的意思是,仅仅把“放下”再往下一点就会导致错误。我们实际上有三件事,但我不确定正确的术语。有“声明”(x是一个存在的东西,总是挂起),“初始化”(将x设置为未定义,挂起时使用var,但不使用let/const)和“赋值”(将x设置为false,从不挂起)
var x = true; // first x variable

if (x == true){ // first x variable
  console.log(typeof(x)); // second x variable, used before declaration
  let x = false; // second x variable created in `if` block
};

console.log(x); // first x variable
var x = true; // first x
if (x == true) { // first x
    let x = false; // second x
    console.log(x); // second x, false
};
console.log(x) // first x, true
var x = true;

if (x == true) {
  let x // hoisted at top of scope, for let scope is this if block
  console.log(typeof(x));
  x = false;
};

console.log(x);