小米技术社区
小米技术社区管理员 关于小米

27岁,山西运城人,职业电商经理人,前端开发工作者,从事过网站建设、网络推广、SEO、SEM、信息流推广、二类电商、网络运维、软件开发,等相关电商工作,经验较为丰富,小米技术社区致力于为广大从事Web前端开发的人员提供一些力所能及的引导和帮助 ...[更多]

E-mail:mzze@163.com

Q Q:32362389

W X:xiaomi168527

小米技术社区大牛王飞 关于王飞

27岁,山西运城人,职业电商经理人,网络工程师兼运维,从事过运营商网络建设,企业网络建设、优化。数据中心网络维护等通过,经验丰富,座右铭:当自己休息的时候,别忘了别人还在奔跑。 ...[更多]

E-mail:wf_live@126.com

Q Q:3940019

微博:王小贱ss

小米技术社区设计小艳 关于小艳

大于花一样的年龄,河南郑州是我家,2010年在北京接触团购网,2011年进入天猫淘宝一待就是四年,如今已经将设计走向国际化(ps:误打误撞开始进入阿里巴巴国际站的设计,嘿嘿)五年电商设计,丰富经验,从事过天猫淘宝阿里各项设计,店铺运营,产品拍摄;我将我的经历与您分享是我的快乐!座右铭:越努力越幸运! ...[更多]

E-mail:97157726@qq.com

Q Q:97157726

标签云
精品推荐
  • 什么是闭包?js闭包的2个最大用途以及注意事项

    什么是闭包?js闭包的2个最大用途以及注意事项

    各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂。简单的说,闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因……
    134人已经看过了
您的位置:首页 > 前端开发 > Javascript > 原生JS

全局作用域,局部作用域,块级作用域,词法作用域,函数作用域,静态作用域的关系和使用场景

分类: 原生JS36个赞

JavaScript作用域: 可访问变量、对象以及函数的集合。


js作用域特性:

1.作用域是程序源代码中定义变量的区域,作用域决定了这些变量的可访问性,如函数内部定义的变量从函数外部是不可访问的。

2.每个函数创建一个新的作用域

3.作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。

4.ECMAScript6之前只有全局作用域和局部作用域(函数作用域),EC6后新出了块级作用域。

5.JavaScript采用词法作用域(lexical scoping),也就是静态作用域。


全局作用域,局部作用域,块级作用域,词法作用域,函数作用域,静态作用域其实归纳起来是4个作用域

分别是词法作用域、全局作用域、局部作用域、块级作用域

其中

全局作用域、局部作用域、块级作用域统称为词法作用域

词法作用域又叫静态作用域

局部作用域又叫函数作用域


1. 全局作用域

函数之外声明的变量,会成为全局变量。全局变量的作用域是全局的:网页的所有脚本和函数都能够访问它。


2. 局部作用域(函数作用域)

指在函数内声明的所有变量在函数体内始终是可见的,可以在整个函数的范围内使用及复用。


3. 块级作用域

指在变量声明的代码段之外是不可见的。参考:ES6的let以及const。


4. 词法作用域(静态作用域)

指函数在定义它们的作用域里运行,而不是在执行它们的作用域里运行.而JavaScript采用的就是词法作用域,也称为静态作用域。


词法作用域

(静态作用域)

全局作用域ES5任何地方都可以访问到的变量对应全局作用域全局变量关闭网页或浏览器才会销毁
局部作用域ES5也叫函数作用域仅限于 ‘函数体’ 内部声明的变量局部变量和块级变量退出作用域之后会销毁
块级作用域ES6 let声明 const声明一切大括号{} 内部使用let/const声明的变量


了解作用域的概念和相关知识对我们学习和深造js有非常大的作用,


全局作用域比较好理解,任何地方都可以访问到的变量对应的作用域是全局作用域这里主要说


局部作用域和块级作用域的区别

相同点:

都是只能在局部访问

不同点:

(1)局部范围不同

局部作用域 : 仅限于 ‘函数体’ 内部声明的变量

块级作用域 : 一切大括号{} 内部使用let/const声明的变量

块级作用域和局部作用域类似

(2)优先级不同(执行上下文不同)

局部作用域优先级 > 块级作用域 (在函数体大括号内部,无论使用什么关键字声明var/let/const都是局部作用域)

块级作用域和局部作用域执行的优先级

(3)预解析规则不同(let隐式变量提升,形成暂时性死区)

var : 显示变量提升。 (在声明前可以访问变量,获取的是undefined)

js编译器在预解析阶段,会把变量的声明提升到当前作用域最顶端,赋值语句还是在原地


let : 隐式变量提升。 (在声明前不可以访问变量,会报错)

变量的声明也会提前,但是不允许被访问

暂时性死区(隐式变量提升)。一旦在当前作用域使用let,则js编译器在预解析阶段会将该变量"绑定"这个作用域,不受任何外部影响

块级作用域和局部作用域的区别1

块级作用域和局部作用域的区别2

块级作用域和局部作用域的区别3

块级作用域和局部作用域的区别4

const与let的异同点

共同点:

(1)都是块级标识符


(2)只在当前代码块内有效


(3)通常情况下,let和常量都不会被提升至作用域顶部


不同点:

const是常量,不能再次赋值,而let是可以的

let还有一个很大的作用,曾经让我们头疼的经典问题,for循环i丢失,经常输出最后一个值得那个问题,终于用let解决,简化了循环过程,不再使用立即调用函数表达式,就可以解决了


相关阅读:

作用域链

小米技术社区