JavaScript之作用域链

var a = b = 10; b也属于imply global

  • window上的属性都具有全局作用域: 在JavaScript中,window == Global

全局作用域存在一定的弊端:如果张三和李四同时都在自己的全局定义同一个全局变量,则会发生变量的覆盖。

2.2 局部作用域

与全局作用域相反,局部作用域内的变量只能被定义它的局部作用域访问。

  • 函数作用域

函数作用域里的变量和函数只能由函数内部访问

function foo() {

var localVar = ‘local’

function localFunc() {

console.log(local)

}

localFunc() // local

}

localFunc() // 报错

作用域是分层的,内部函数可以访问外部函数作用域里的变量,反之不可以(作用域链)。

function foo() {

var localInnerVar = ‘localInner’

function localFunc() {

console.log(local)

}

localFunc() // localInner

}

注意:快语句({}内的语句),比如ifwhile等,不会创建新的作用域。

if (1) {

var a = 10

}

console.log(a) // 10

  • 块级作用域

ES6新增了letconst两种声明变量的命令,所声明的变量只能在指定块的作用域内被访问。

  • 不会发生变量提升

console.log(b) // undefined

console.log(a) // Uncaught ReferenceError: a is not defined

let a = ‘i am there’

var b = ‘i am here’

  • 不允许重复声明

console.log(a) // Identifier ‘a’ has already been declared

var a = ‘the first’

let a = ‘the second’

  • 常见闭包问题解决

在学习闭包问题的时候,很容易写出类似下面的代码

var arr = [];

for (var i = 0; i < 10; i++) {

arr[i] = function() {

console.log(i);

}

}

arr0 // 10

最终返回的结果是10,把所有的arr执行一遍,发现最后的结果都是10

当时我们采用立即执行函数的方式来解决上面的闭包问题:

var arr = [];

for (var i = 0; i < 10; i++) {

(function (i) {

arr[i] = function() {

console.log(i);

}

}(i))

}

arr0 // 0

立即执行函数解决上述闭包问题,其实就是借助了作用域链方面的知识,相当于给arr[i]函数的外层添加了一层作用域。但当我们学习let之后,解决上面问题就简单多了。

var arr = [];

for (let i = 0; i < 10; i++) {

arr[i] = function() {

console.log(i);

}

}

arr0 // 0

3.作用域链


JavaScript函数执行时,首先会在自身的AO中查找对应属性值,若查找不到,则会去父级的AO上找,在查找不到则再去父级的父级查找,直到找到根window对象,这样形成的“AO链”就是作用域链。

下面以一个例子来模拟整个作用域链的流程:

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值