JavaScript变量提升 了解JavaScript变量提升

什么是变量提升

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

变量提升的各种情况

正常变量使用,先声明再使用

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

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

在变量声明之前使用

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 1var bar=9;console.log(bar);//9var bar;console.log(bar);//9// example 2var 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 functionvar 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 1function test(params) { let params = 1;}test(0);// throw Error: Uncaught SyntaxError: redeclaration of formal parameter params // example 2function func() { let test = 1; let test = 3;}func();// throw Error: Uncaught SyntaxError: redeclaration of let test // example 3function 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 2var t1=new Test();class Test{}// throw Error: Uncaught SyntaxError: redeclaration of let Test // example 3class Test{}var Test=1;// throw Error: Uncaught SyntaxError: redeclaration of class Test

参考

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

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月28日
下一篇 2022年6月28日

相关推荐

  • 解决物体检测中的小目标问题

    作者丨Jacob Solawetz 来源丨小白学视觉 编辑丨极市平台 为了提高模型在小物体上的性能,我们建议使用以下技术: 提高图像捕获分辨率 提高模型的输入分辨率 平铺图像 通过…

    2022年6月12日
  • MATLAB App Designer – 面向对象编程(一)

    公号【新能源动力电池与BMS】。 “MATLAB App Designer面向对象编程方法及特点,应用案例介绍” 什么是MATLAB App Designer? 首先,App De…

    2022年6月27日
  • python经济学模型 Python+经济学:成本函数与图像

    前言: 本文可以说是上一篇文章的“姊妹篇”,同样利用一元二次函数图像的性质,构造边际成本函数(Marginal Cost Function),然后在此基础上还原各种成本函数。为了让…

    2022年6月28日
  • Linux时间和日期

    1 两种时间 linux提供了两种时间: (1)日历时间。该值是自 协调世界时(Coordinated Universal Time, UTC)1970年1月1日00::00::0…

    2022年6月14日
  • Python – 魔法方法和方法重写

    魔法方法总结 字符串/字节序列表示相关:__repr__、__str__,__format__,__bytes__。这些主要是做一些格式化的操作。 数值转换:__abs__、__b…

    2022年8月20日
  • 零时科技 || DPC攻击复现

    背景 北京时间2022年9月10日,DPC代币合约遭到黑客攻击,损失超73,614 BUSD, 零时科技安全团队及时对此安全事件进行分析,详情可移步至分析文章“零时科技 || DP…

    2022年10月18日
  • 北京大学:收到陈春花辞职申请,按程序终止其聘用合同

    8月3日,@北京大学 发布声明称:近期,我校对陈春花老师的有关情况进行了调查。8月3日,我校国家发展研究院收到了陈春花老师的辞职申请。学校按程序终止其聘用合同。

    2022年8月4日
  • 印度小型卫星运载火箭首次发射任务失败

    印度空间研究组织7日发表声明称,当天发射的小型卫星运载火箭未将搭载的卫星送入预定轨道。印度媒体报道称,这意味着印度小型卫星运载火箭首次发射任务失败。 印度空间研究组织当天上午在位于…

    2022年8月17日
  • 《我的世界》与微积分

    在知名游戏《我的世界》中,无数个小方块可以组成洛种宏伟的建筑,构成了一个神奇的“方形世界”。但如果你远望那些漂亮的建筑,并不会觉得它们是方的,因为足够小、足够多的小方块连宠来塑造了…

    2022年8月22日
  • 面试官:有了解过ReentrantLock的底层实现吗?说说看

    我们可以了解到它是一个可重入锁,下面我们就一起看一下它的底层实现~ 构造函数 我们在使用的时候,都是先new它,所以我们先看下它的构造函数,它主要有两个: public Reent…

    2022年6月19日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息