当前位置: 首页 > 科技观察

什么是JavaScript中的“提升”?

时间:2023-03-12 14:21:54 科技观察

在执行JavaScript代码之前,js引擎会先解析并编译它。在编译过程中,变量和函数声明被放入内存,这被称为提升。注意声明只是提升,而不是初始化,这意味着如果一个变量在使用后被声明和初始化,它的值将不会被初始化。当用function声明函数时,可以在定义函数之前调用该函数,它将按预期工作。示例:hello();//输出“Helloworld!”functionhello(){console.log('Helloworld!');}hello();//输出'Helloworld!'在上面的示例中,函数声明被提升到其范围的顶部,并且由于函数声明的性质,在声明之前可用。但这是函数提升行为的唯一情况。另一方面,var与var声明的行为不同,在它被初始化之前访问它会返回未定义。例如:console.log(x);//输出'undefined'f();//抛出异常:'UncaughtTypeError:fisnotafunction'varx=1;varf=()=>'Hi!';console.log(X);//输出'1'f();//返回“嗨!”正如你在这个例子中看到的,var声明被提升到它的作用域的顶部,但是变量的值是它会在执行时被初始化,所以在初始化这行代码之前它是未定义的。const和letconst和let声明被提升,但它们没有被初始化为undefined。相反会给你一个错误,这是类声明的行为方式。例如:console.log(y);//抛出异常:'UncaughtReferenceError:Cannotaccess"y"beforeinitialization'g();//抛出异常:'UncaughtReferenceError:Cannotaccess"g"beforeinitialization'lety=2;constg=()=>'嘿!';console.log(y);//输出'2'f();//返回'嘿!'通常,在初始化之前访问用var声明的变量将无声地失败,用const或let做同样的事情会导致干净、易于调试的错误。总结在使用变量、函数、对象和类之前,首先定义它们很重要。ESLint或许可以帮助您解决这个问题。在你的项目中尽可能使用const和let而不是var。这样可以省去很多麻烦。尽可能只使用箭头函数或函数声明。一致性有助于减少混淆。