手机版

谈谈我对JavaScript原型和闭包系列的理解(注9)

时间:2021-09-19 来源:互联网 编辑:宝哥软件园 浏览:

相关阅读:说说我对JavaScript原型和闭包系列的理解(注6)说说我对JavaScript原型和闭包系列的理解(注8)。

行动范围

参考《JavaScript语言精粹和编程实践》中范围:的定义。

变量的范围也称为变量的可见性。可变范围隐藏信息,即处理“分裂主义”问题。

js中没有块级别的作用域(ES6中有一个字母,可以在{}中声明,if,for,作用域被限制在块级别。let声明的变量没有变量提升!这里就不说了,因为是偶然看到的。)。

在编写代码时,我们不应该在“块”中声明变量,而应该在代码的开头声明变量,以避免歧义。

for(var I=0;i 10I) {//不良申报方式//.} console . log(I);/*-*/var I=0;//声明for(I=0;i 10i ) { //.} console . log(I);除了javascript的全局范围,还有一个函数范围。

我们在声明变量时,全局代码在前面声明,函数中声明的变量应该在函数体之前声明。同时,在声明变量时必须使用“var”运算符。

A=10,//全局范围b=20函数fn() {//fn函数作用域var a=100,c=300函数bar() {//bar函数作用域var a=1000,d=4000}}全局代码、fn函数和bar函数都形成一个作用域。范围具有父子关系,这取决于创建函数的范围。在fn函数作用域下创建一个bar函数,“fn函数作用域”是“bar函数作用域”的父级。

作用域最大的用处就是隔离变量,同名的变量在不同的作用域下不会冲突。

-

范围是在定义函数时确定的,而不是在调用函数时。

1.程序加载时已经确定了全局上下文,变量将随着程序的执行而被赋值。

2.执行到第36行,调用fn(10),创建fn函数的执行上下文环境,推送堆栈,并将该上下文设置为活动状态。

3.执行到第32行,调用bar(100),创建bar(100)函数的执行上下文环境,推送堆栈,并将该上下文设置为活动状态。

4.bar(100)的调用完成后,栈弹出,bar(100)函数的上下文被破坏。然后执行33行,调用bar(200),创建bar(200)函数的执行上下文环境,推送栈,将上下文设置为活动的。

5.在bar(200)的调用完成后,它会弹出并销毁其上下文。此时,的控制被移交给fn(10)上下文,该上下文再次变为活动状态。

6.此时,fn(10)被调用、弹出,其上下文被破坏。控制权交给全局执行上下文。

至此,这段代码的执行过程结束。

然后借用原作者的完整图片:

总结:

范围只是一个“地盘”,变量值要通过范围对应的执行上下文来获取。在相同的作用域下,不同的调用会产生不同的执行上下文,进而产生不同的变量值。因此,作用域中变量的值是在执行过程中确定的,而作用域是在创建函数时确定的。因此,如果你想在一个作用域中找到一个变量的值,你需要找到该作用域对应的执行上下文,然后在其中找到该变量的值。

版权声明:谈谈我对JavaScript原型和闭包系列的理解(注9)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。