Javascript 起重吊装

Javascript 起重吊装,javascript,Javascript,在我的代码中,x值是未定义的。如果删除If块,则x值显示为77。我不明白为什么如果块正在修改x值 var x=77; 函数fn(){ if(false){ var x=55; } 控制台日志(x); } fn()只需删除if语句中的var。这将解决起重问题 var x = 77; function fn() { if(false) { x = 55; } console.log(x); // 77 } fn(); 在函数范围内,变量x被提升到顶部,

在我的代码中,x值是未定义的。如果删除
If
块,则x值显示为77。我不明白为什么
如果
块正在修改x值

var x=77;
函数fn(){
if(false){
var x=55;
}
控制台日志(x);
}

fn()
只需删除if语句中的
var
。这将解决起重问题

var x = 77;

function fn() {
    if(false) {
        x = 55;
    }
    console.log(x); // 77
}

fn();

在函数范围内,变量x被提升到顶部,如下所示
var x
如果您打印它,您将得到
未定义的
。它从未被分配变量,因为它没有进入if块
var x=77;
函数fn(){
if(false){
var x=55;
}
console.log(x);//取消查找
}

fn()在函数内部重新声明和提升x变量,但从未设置,因为永远不会达到
if(false)
,因此
未定义
。如果删除内部声明,则函数内部已知外部x

这可以通过使用
const
let
(ES6)而不是
var
来解决
const
let
未吊装,仅在声明的支架内:

const x = 77;

function fn() {
  if (false) {
    const x = 55;
  }
  console.log(x);  // 77
}
fn()

另一种解决方案是只使用两个不同的变量名,或者根据需要删除if语句中的var…

您也可以使用let关键字

let x = 77;

function fn() {
  if (false) {
    let x = 55;
  }
  console.log(x); // 77
}

fn()

在分配变量时,应该使用wither ES6定义语法const或let,如果需要改变变量,则使用let,否则使用const,停止使用var。 在您的场景中,当在那里使用var时,这意味着您试图重新初始化x,它将被提升 var x=77;方法 var x;在街区外。 因此不需要重新初始化x,只需传递值或使用let或const即可

function fn() {
  if (false) {
  // 
    x = 55;
  }
  console.log(x);
}

fn();

通过使用
var
关键字,您已将其作为函数范围内的局部变量。由于提升,该变量存在,但由于if条件不为true,因此未指定值。