Excution Context上下文 作用域链 全局作用域 函数作用域 块级作用域

EC,执行上下文(简称上下文)决定了Js执行过程中可以获取哪些变量、函数、数据

先声明一下EC不等于作用域,先有上下文,再有作用域

EC 执行上下文,决定了Js执行过程中可以获取哪些变量、函数、数据,一段程序可能被分割成许多不同的上下文,每一个上下文都会绑定一个变量对象(variable object),它就像一个容器,用来存储当前上下文中所有已定义或可获取的变量、函数等。位于最顶端或最外层的上下文称为全局上下文(global context)

JS在运行过程中,首先是在global全局上下文中,遇到函数执行,开启新的上下文,函数被压入栈顶,叫做进栈,执行完之后,就被弹出,叫做出栈

栈像一个盒子一样,一层一层的,后放进的东西先出来,先放进去的东西后出来

JS解释器总是工作在栈顶,也就时指向当前上下文,当前在运行的函数

EC会绑定当前函数的参数对象,arguments和函数本地的变量

之后会创建属于该上下文的作用域链

最后将this赋予这一function所属的Object(实例对象)

在这里插入图片描述
在这里插入图片描述

上文提到this被赋予function所属的Object,具体来说,当function是定义在global对中时,this指向global;当function作为Object的方法时,this指向该Object【也就是指向调用这个function的对象】

在这里插入图片描述

Scope chain 作用域链

在function被执行时生成新的上下文时会先绑定当前上下文的变量对象,再创建作用域链

function的定义是可以嵌套在其他function所创建的上下文中,也可以并列地定义在同一个上下文中[****** 注意,作用域链是在定义时形成的,而不是在函数执行时产生的******]

作用域链实际上就是自下而上地将所有嵌套定义的上下文所绑定的变量对象串接到一起,使嵌套的function可以“继承”上层上下文的变量,而并列的function之间互不干扰

也就是顶层的函数EC的作用域中在查询函数作用域的变量时,如果找不到需要查找的变量,那么就去下面的EC中的作用域查找,一直找到Global,这条查找的线就是一条作用域链,作用域链在定义就形成了,按照这个作用域链查找变量,就形成了查找变量的规则------->

当前EC的作用域没有,去上一层EC的作用域查找…

作用域

变量作用域

变量作用域

全局变量

在JavaScript中全局变量的作用域比较简单,它的作用域是全局的,在代码的任何地方都是有定义的。

局部变量

函数的参数和局部变量只在函数体内有定义。另外局部变量的优先级要高于同名的全局变量,也就是说当局部变量与全局变量重名时,局部变量会覆盖全局变量,也就是按作用域链查找,在到达全局变量之前找到了对应的变量,就不再继续查找,是不再继续查找,不是覆盖。

作用域链

在这里插入图片描述

当前函数作用域(!!!是函数作用域,ES5只有函数作用域和全局作用域,没有块级作用域,块级作用域就是{}包起来的代码块)查找不到,就一级一级往上查询,直到查询global,这就是一条作用域链

再提一嘴ES5的函数作用域和全局作用域引发的问题

函数作用域和全局作用

ES5中变量不是全局的就是局部的,没有块级概念,也就是说,不是函数里面的用var声明的变量,都是全局变量

那么在 for 和 if 里面var声明的变量是属于谁呢???

按照上面的定义,不是函数内部用var声明的,都是全局作用域的变量,也就是全局变量,很明显,for if不是一个函数,那么,他们是全局变量

在这里插入图片描述

很明显,每一次的事件绑定都改变了全局的 i 的值

导致最后执行的都是 list[list.length - 1].onclick = function(){ console.log(list.length - 1)}

怎么解决这个问题呢?

只要不让每次循环的i互相影响就好了,也就是不能让i成为全局变量,但是只有函数作用域和全局作用域,造一个块级作用域就害了

于是每次的i之间互不影响,就可以实现正确的事件绑定了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值