作者:前端小混混 来源:前端先锋
在执行JAVAScript代码之前,js引擎首先会对其进行解析和编译 。在编译阶段,变量和函数声明被放入内存,这被称为提升(hoisting) 。
需要注意的是,声明只是被提升,而不是被初始化,这意味着如果一个变量在使用后被声明并初始化,则不会初始化它的值 。

文章插图
【JavaScript 中的“提升”是怎么回事?】
function使用 function 声明时,可以在定义之前调用这个函数,它会按预期正常工作 。例如:
hello(); // 输出 'Hello world!'function hello() {console.log('Hello world!'); }hello(); // 输出 'Hello world!' 在上面的例子中,function 声明被提升到其作用域的顶部,并且由于函数声明的性质,在声明之前就可用 。不过这是函数提升行为的唯一案例 。var另一方面,var 声明的行为有所不同,在其初始化之前进行访问会返回 undefined 。例如:
console.log(x); // 输出 'undefined' f(); // 抛出异常:'Uncaught TypeError: f is not a function'var x = 1; var f = () => 'Hi!';console.log(x); // 输出 '1' f(); // 返回 'Hi!' 正如你在这个例子中所看到的,var 声明被提升到它作用域的顶部,但是变量的值只有在初始化代码被执行时才会初始化,所以在初始化这行代码之前是 undefined 。const 和 letconst 和 let 声明被提升,但它们没有被初始化为 undefined 。而是会给你一个错误,这也是 class 声明的行为方式 。例如:
console.log(y); // 抛出异常: 'Uncaught ReferenceError: Cannot access "y" before initialization' g();// 抛出异常: 'Uncaught ReferenceError: Cannot access "g" before initialization'let y = 2; const g = () => 'Hey!';console.log(y); // 输出 '2' f(); // 返回 'Hey!' 一般情况下,在初始化之前访问用 var 声明的变量会默默地失败,对 const 或 let做同样的事情会导致一个清晰的、易于调试的错误 。总结
- 在使用变量、函数、对象和类之前,务必要先定义它们 。ESLint 可能可以帮你解决这个问题 。
- 在项目中要尽可能的使用 const 和 let,而不是 var。这样可以减少很多麻烦 。
- 如果可能的话,只使用箭头函数或 function 声明 。一致性有助于减少混乱 。
推荐阅读
- 荣耀|赵明回应网传“被离职”:仍是荣耀终端董事和CEO
- 商标|“奥特曼”是驰名商标:侵权者被判赔80万元
- 直播|薇娅直播间卖“袁米”被判侵权 赔偿10万:擅用袁隆平姓名、肖像
- |“为什么夫妻到了中年后,大部分会分床睡?”这个问题有点社会了!
- 在汜水关之战中被当时默默无名的关羽斩杀的猛将是?,关羽在汜水关斩的大将
- 柠檬放进微波炉,网传柠檬能清洁微波炉
- 男装|?答应我:这三种“脸型”的女人,别再披头散发了,显脸大还显老!
- 四时捺钵有怎样的历史影响,四时捺钵是哪个民族统治者的生活方式
- 您必须知道的5条宽带“小秘密”
- “总角之交”是指怎样的朋友?
