【javascript中的变量提升和函数提升】

变量提升一般发生在var定义的变量,当前某个变量声明前使用该变量,它不会报错,而是undefined,这是由于js的运行原理决定的。
浏览器运行js脚本时,会创建一个全局的执行上下文,js中的一切都发生在执行上下文中,执行上下文包含两个组件:内存组件和代码组件。

js执行包含两步:
1.创建内存,也叫预编译:首先扫描全部代码,为所有的变量和函数分配内存,变量此时赋值为undefined,,函数则是保存整个函数代码,因此,在正式执行代码时,在声明之前访问某个变量和函数,是可以访问到的,也就是我们的变量提升和函数提升;
2.代码执行:逐行执行代码,将变量的值赋值给内存中相应的变量,遇到执行函数的,js会在上一个执行上下文内创建新的执行上下文用于存储函数内的所有变量和函数并执行其代码,执行完毕之后会删除该执行上下文。当函数嵌套函数过多时,执行上下文会变的复杂,便会在调用栈的帮助下管理代码执行上下文的创建和删除。调用栈是一种在调用多个函数的脚本中跟踪位置的机制。
js的工作原理可以参考下面的链接:
借鉴文献链接,这里讲得很详细 https://www.cnblogs.com/szmtjs10/p/16110302.html
函数提升的优先级高于变量提升,函数提升不会被同名变量所覆盖,但是会被赋值后的变量所覆盖。

函数提升不会被同名变量所覆盖

function a(){};
var a;
console.log(typeof a);  //function

但是会被赋值后的变量所覆盖

function a(){};
var a = 1;
console.log(typeof a);  //number

从上面的内容可以得出,变量提升的仅仅是变量的声明,而不会提升赋值;函数会将整个函数提升

console.log(a);
console.log(b());
var a = 1;
function b(){
    return 1;
};
//结果
VM162:1 undefined
VM162:2 1

那为什么es6中的let和const没有变量提升呢?
我们总结一下变量提升:变量提升是js引擎在运行前将变量的声明提升至作用域顶部的行为,这意味着,在声明前访问变量,我们也是可以访问到的。

然后我们解释一下为什么let没有变量提升,首先变量生命周期包含:
1.声明阶段:在作用域中注册一个变量;
2.初始化阶段:是分配内存并为作用域中的变量创建绑定。 在此步骤中,变量将使用undefined 自动初始化;
3.赋值阶段:是为初始化的变量赋值。

var声明的变量在js引擎编译阶段会将变量声明提升至作用域的最顶部,并默认初始化为undefined,而let的这两步是分开的,在未初始化之前,变量位于“暂时性死区”;

具体可参考下面的链接
https://blog.csdn.net/weixin_30505225/article/details/100094154

代码就像盖高楼,只有底层根基足够扎实,才可以建成稳固的高楼。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值