余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

了解JavaScript变量提升(JavaScript变量提升)

xiyangw 2022-11-26 16:47 14 浏览 0 评论

什么是变量提升

变量提升(Hoisting)被认为是, JavaScript中执行上下文 工作方式的一种认识。从概念的字面意义上说,“变量提升”意味着变量和函数的声明会在物理层面移动到全局代码或者代码块的最前面,但这么说并不准确,实际上变量和函数声明在代码里的位置是不会动的,而是在编译阶段被放入内存中。

变量提升的各种情况

  • 正常变量使用,先声明再使用
bla = 2;
var bla;
console.log(bla);// 2
//可以隐式地将以上代码理解为
var bla; // 变量声明会提升到作用域顶部
bal = 2; // 赋值会被保留在原位置
console.log(bla);// 2

建议始终在作用域顶部声明变量(全局代码的顶部和函数代码的顶部),这可以清楚知道哪些变量是函数作用域(局部),哪些变量在作用域链上解决。

了解JavaScript变量提升(JavaScript变量提升)

  • 在变量声明之前使用
function doSomething() {
    console.log(bar); // undefined
    var bar = 111;
    console.log(bar); // 111
}
//可以隐式地将以上代码理解为
function doSomething() {
    var bar; //声明提升至代码块顶部
    console.log(bar); // undefined
    bar = 111;
    console.log(bar); // 111
}

如果去除变量声明

function doSomething() {
    console.log(bar); // Uncaught ReferenceError: bar is not defined
}
  • 同名变量多次声明

同名变量多次声明,重复的声明会被忽略,每次赋值都会执行,调用时,使用最近的一次赋值。

// example 1
var bar=9;
console.log(bar);//9
var bar;
console.log(bar);//9
// example 2
var bar=9;
console.log(bar);// 9
 var bar=3;
console.log(bar); // 3
  • 函数声明提升

JavaScript 中的函数声明被提升到了函数定义。你可以在函数声明之前使用该函数:

hoisted(); // logs "foo"

function hoisted() {
  console.log('foo');
}
//可以理解为
function hoisted() {
  console.log('foo');
}
hoisted(); // logs "foo"

重复的函数声明,后者会覆盖前者。

hoisted(); // logs "bar"

function hoisted() {
  console.log('foo');
}

function hoisted() {
  console.log('bar');
}

注意:函数表达式不会被提升,如下:

notHoisted(); // TypeError: notHoisted is not a function

var notHoisted = function() { //函数表达式
  console.log('bar');
};

变量提升也适用于其他数据类型和变量。变量可以在声明之前进行初始化和使用。但是如果没有初始化,就不能使用它们。

JavaScript 只会提升声明,不会提升其初始化。

函数和变量相比,会被优先提升。这意味着函数会被提升到更靠前的位置。

let 与 const 对变量提升的影响

  • 块作用域
{
    let a='test';
}
console.log(a); // throw Error: Uncaught ReferenceError: a is not defined
  • 必须先声明,再使用
let a = 1;
function test() {
    console.log(a);
    const a = 2;
}
test(); // throw Error: Uncaught ReferenceError: can't access lexical declaration 'a' before initialization
  • 同一作用域不能存在相同标识符的变量或者函数
// example 1
function test(params) {
    let params = 1;
}
test(0);// throw Error: Uncaught SyntaxError: redeclaration of formal parameter params
   
// example 2
function func() {
    let test = 1;
    let test = 3;
}
func();// throw Error: Uncaught SyntaxError: redeclaration of let test
   
   // example 3
function func() {
    let inner=2;
    function inner (){
        console.log(111);
    }
}
func();// throw Error: Uncaught SyntaxError: redeclaration of let inner
  • class关键字的在声明方面类似let和const
// example 1
{
    class Test {
    }
}
var t1 = new Test();
// throw Error: Uncaught ReferenceError: can't access lexical declaration 'Test' before initialization
   
// example 2
var t1=new Test();
class Test{}
// throw Error: Uncaught SyntaxError: redeclaration of let Test
   
// example 3
class Test{}
var Test=1;
// throw Error: Uncaught SyntaxError: redeclaration of class Test

参考

  1. MDN:https://developer.mozilla.org/zh-CN/docs/Glossary/Hoisting
  2. JavaScript变量提升总结:https://juejin.cn/post/7050746117734023181

相关推荐

前端高薪就业,那自学Web前端要多久?自学Web前端难不难?
前端高薪就业,那自学Web前端要多久?自学Web前端难不难?

聊起自学Web前端那真是有说不尽的话题,不管是学什么技能,技能难不难好不好学、发展前景好不好、就业薪资高不高是我们第一关注的问题,下面我们来说一下自学前端难不难...

2023-03-21 18:42 xiyangw

Java系统学习需要多长时间?(洗牙需要多长时间)
Java系统学习需要多长时间?(洗牙需要多长时间)

学习java需要多长时间?这个最主要是取决于学习方式,如果是自学的话,基础好的可能花个大半年时间,有人可能1-2年也都只能学到皮毛。除此之外,还跟个人的计算机基...

2023-03-21 18:42 xiyangw

学web前端开发需要多久?web前端要学哪些内容?

  近年来,web前端开发技术越发的火热,前端开发工程师的需求量越来越大,就业前景可谓是一片大好。同时,web前端开发的学习门槛较低,因此有不少小伙伴选择转行学习web前端开发技术。学web前端开发需...

web前端程序员培训学习需要学多久(web前端培训出来后的怎么样)
web前端程序员培训学习需要学多久(web前端培训出来后的怎么样)

现在web前端开发技术在市场发展过程中的需求量在不断地增加,有越来越多的小伙伴想要通过学习web前端开发技术知识来入行IT行业。对于零基础小伙伴学习前端开发技术...

2023-03-21 18:41 xiyangw

学it需要多长时间?web开发技术要学哪些?(web开发技术)
学it需要多长时间?web开发技术要学哪些?(web开发技术)

  学it需要多长时间?5-6个月时间即可。这里说的是在重庆it培训班里学习,有专业的老师带领下高强度的学习,就能够在短时间内学会一门it技术。而如果是自学的话...

2023-03-21 18:41 xiyangw

零基础学习前端培训一般需要多久(前端培训大概费用)
零基础学习前端培训一般需要多久(前端培训大概费用)

与其他的编程语言相比较,前端开发技术的入门学习门槛较低是公认的,但是随着近几年来前端开发技术的不断更新,想要从事前端开发行业,小伙伴想要学习的前端开发技术知识点...

2023-03-21 18:41 xiyangw

web前端开发技术培训需要学习多久呢(web前端开发培训哪个机构比较好)
web前端开发技术培训需要学习多久呢(web前端开发培训哪个机构比较好)

前端开发技术培训费用是多少,需要学习多久?随着市场上新型开发场景的不断增多,企业对前端开发技术的要求也在不断的提升,对前端开发工程师的需求量在不断的增多,市场上...

2023-03-21 18:41 xiyangw

学web前端开发需要多久?学Web前端开发有什么优势?
学web前端开发需要多久?学Web前端开发有什么优势?

随着it行业的发展前景你一片大好,无论是岗位需求还是就业薪资都比较理想,很多人也想转行IT开发。很多人建议零基础转行IT开发选择前端开发。那么,学Web前端开发...

2023-03-21 18:41 xiyangw

零基础参加web前端培训需要学习多久(web前端自学需要多久)
零基础参加web前端培训需要学习多久(web前端自学需要多久)

  前端开发作为IT行业中相对比较好学的方向,薪资水平也不低,所以很多零基础的人在转行的时候都会选择Web前端相关的行业。而零基础转行首先需要学习前端技术,那么...

2023-03-21 18:41 xiyangw

前端培训学费一般多少?需要多长时间?(前端培训学费一般多少?需要多长时间才能学完)
前端培训学费一般多少?需要多长时间?(前端培训学费一般多少?需要多长时间才能学完)

  在互联网时代,我们是离不开开发的,毕现在我们工作生活都有开发技术的参与。如今前端开发是比较热门的技术,现在学习前端的小伙伴非常多,大部分都会选择培训的方式快...

2023-03-21 18:40 xiyangw

web前端开发培训要多久?web前端框架有哪些?(web前端架构培训哪里有)
web前端开发培训要多久?web前端框架有哪些?(web前端架构培训哪里有)

  IT开发行业中前端开发岗位一直是大家关注度比较高的,有不少小伙伴都想学习前端开发进入IT行业。web前端开发培训要多久?除了需要掌握基本的前端开发知识以外,...

2023-03-21 18:40 xiyangw

前端开发培训一般几个月(做前端开发需要学什么)
前端开发培训一般几个月(做前端开发需要学什么)

随着移动互联网的快速发展,市场对编程技术人才的需求越来越大,像Java、前端这样的技术人才的需求也越来越大,让不少人都看到了学编程未来的前景,学习编程技术的人也...

2023-03-21 18:40 xiyangw

Web前端小白入门封神之路 第八节(js入门基础)

视频加载中...关注微信号“网页设计自学平台”回复以下|关键字|获取资源----------------------------------------------------------------...

JS基础入门-函数的使用(js函数教程)
JS基础入门-函数的使用(js函数教程)

今日背诵小纸条函数的定义1.命名函数functionfn(形参1,形参2...){//函数功能代码}2.匿名函数varfn=function(形...

2023-03-21 18:39 xiyangw

javascript -Ajax基础入门(javascript语法基础)
javascript -Ajax基础入门(javascript语法基础)

1.什么是Ajax?a)无刷新的数据读取;2.关于浏览器缓存:a)缓存机制:根据地址来缓存,同样地址只读一次;b)解决缓存困扰:在文件名后加上一个时...

2023-03-21 18:39 xiyangw

取消回复欢迎 发表评论: