Javascript 为什么代码段输出为这样?

Javascript 为什么代码段输出为这样?,javascript,function,closures,lexical-scope,Javascript,Function,Closures,Lexical Scope,user和sayHi都在if块内定义,但sayHi在块外可用,同时user不可用。为什么?每当您使用var定义变量时,该变量将被提升-这意味着其声明将移动到当前范围的顶部。 但是,对于使用let/const创建的作用域变量而言,情况并非如此,其中变量仅在其创建的作用域中定义块作用域是if、switch条件或for和while循环中的区域。一般来说,每当你看到{花括号},它就是一个块。在ES6中,const和let关键字允许开发人员在块范围内声明变量,这意味着这些变量只存在于相应的块内 const

user和sayHi都在
if
块内定义,但sayHi在块外可用,同时user不可用。为什么?

每当您使用
var
定义变量时,该变量将被提升-这意味着其声明将移动到当前范围的顶部。
但是,对于使用
let
/
const
创建的作用域变量而言,情况并非如此,其中变量仅在其创建的作用域中定义

块作用域是if、switch条件或for和while循环中的区域。一般来说,每当你看到{花括号},它就是一个块。在ES6中,
const
let
关键字允许开发人员在块范围内声明变量,这意味着这些变量只存在于相应的块内

const phrase = 'Hello';

if (true) {
  const user = 'John';

  var sayHi = () => {
    console.log(`${phrase}, ${user}`);
  };
}

sayHi(); // Hello, John
console.log(user); // ReferenceError: user is not defined

在您的程序中,
用户
是作用域常量,只有在
if
块中才能访问。 这就是为什么在
if
块之外使用时会得到
undefined


见此。

该变量是在if语句的作用域内使用'const'关键字创建的,简单地说,它是在开头“{”和结尾“}”内创建的,因此只能在括号内访问,因为'const'和'let'具有块作用域

可能的副本和阅读此感谢你们。我得到了它。这是我从你的房间里找到的。我认为作者犯了错误,结果不是错误。它会起作用的。
const phrase = 'Hello';
const user = 'John';

if (true) {
  var sayHi = () => {
    console.log(`${phrase}, ${user}`);
  };
}

sayHi(); // Hello, John
console.log(user); // This will work now, this answer is similar to @Saurabh Agrawal