作用域链和预解析机制

本文介绍了JavaScript中的作用域概念,包括全局作用域、函数作用域和块级作用域,并强调了let与var的区别。作用域链是变量查找的规则,从当前作用域向上搜索直到全局作用域。预解析机制涉及到变量和函数的声明提前,var声明的变量会被提升,而let则不会。此外,let声明的变量不会成为全局对象的属性。
摘要由CSDN通过智能技术生成

作用域链

什么是作用域

  • 从script标签内的声明的变量和函数都是0级作用域
  • 函数能开辟作用域(ES6以后,只要{ } 就能开辟一个块级作用域只有let 声明的变量有用,对var没用)
  • 所以声明在0级作用域的函数开辟的一个作用域是1级作用域
  • 在1级作用域再声明一个函数就会开辟又一个作用域是2级作用域,依次类推

作用域链

  • 变量的访问规则就是,自己的作用域里声明这个变量就用这个变量,没有就向上一级的作用域里找 ,一直找到0级作用域,找不到就会报错
  • 每一个作用域向链条一样连接起来,就叫作用域链

预解析机制

  • 在执行代码前为了,代码运行的速率提高,在代码的执行前浏览器会预解析代码会在内存中开辟好变量和函数的空间,执行代码时就赋值给变量就行了。
  • 除了开辟变量和函数的空间,还有一个过程就是变量提升

变量提升

  • 就是把所有var声明的变量和function关键字声明的函数,都会提升到他所在作用域的顶端,然后赋值语句留在原来位置

let和var的比较

  • 相同点:
    都是用来声明变量的
  • 不同点:
    1.var在0级作用域里声明的变量是window的属性,let声明的变量不是
    2.var声明的变量在预解析的机制过程会有变量提升,但let的不会
    3.var的作用域参考的是函数开辟的作用域,而let参考的块级作用域就是有(大括号{}就一个块级作用域)
    4.var可以在相同的作用域重复声明相同的变量名的变量,而let声明的变量名不能相同,会报错
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值