js块级作用域和函数作用域,块级作用域和函数作用域
本文为您带来了JavaScript中块级作用域实现原理的一些知识。在ES6之前,JavaScript不支持块级范围。JavaScript是如何支持块级作用域的?本文将阐述块级作用域的底层实现原理,希望对大家有所帮助。
作用域与执行上下文
很多人认为范围和执行上下文是同一个概念,这是完全错误的!
作用域
声明函数时,范围已经确定。作用域是一组按名称查找变量的规则,即确定当前执行的代码对变量的访问权限。JavaScript支持三种类型的作用域:全局作用域、函数作用域和块级作用域。
执行上下文
执行上下文是js引擎从解释到运行中间预编译的准备工作,创建当前区域的执行环境,这个执行环境就是执行上下文。
执行栈
调用栈用于在js代码中安装各种执行上下文,是js引擎跟踪函数执行的一种机制。
以下面的代码为例:
console . log(1);
函数pFn() {
console . log(2);
(函数cFn() {
console . log(3);
}());
console . log(4);
}
pFn();
console . log(5);
//Output: 1 2 3 4 5首先是全局环境中的执行上下文。调用pFn后,函数环境pFn的执行上下文被推入堆栈。由于cFn函数是在pFn中执行的,所以继续被推入cFn函数的执行上下文中,然后依次从堆栈中弹出。
全局上下文只会在应用程序退出之前被销毁,比如关闭网页或者退出浏览器。
javascript 是如何支持块级作用域的
我们知道在js中,由于初始设计的不规范,用var关键字定义变量会导致变量提升等一系列问题。但是,为了保持兼容性,我们还必须保留对var声明变量的方式的支持。那么:JavaScript如何同时支持变量提升和块级作用域?
以下面的代码为例:
函数foo() {
var a=1;
设b=2;
{
设b=3;
var c=4;
设d=5;
console . log(a);
console . log(b);
}
console . log(b);
console . log(c);
console . log(d);
}首先,函数内部var声明的变量存放在变量环境中,let声明的变量存放在预编译阶段的词法环境中。当然,函数体内部的块作用域中let声明的变量并不存储在词法环境中。
继续执行代码。执行代码块时,变量环境中A的值已经设置为1,词法环境中B的值已经设置为2。注意,let声明的变量B和D不是欠定义的,而是此时未初始化的。
最后,当函数体的块范围结束时,它的内部变量将从词法环境的栈顶弹出。
总结
我们可以知道上述问题的答案:
let声明的所有变量都存储在词法环境中,块级作用域由词法环境的堆栈结构实现,变量提升由变量环境实现。两者的结合同时支持变量提升和块级范围。
以及如何找到变量:
从词法环境的作用域栈顶往下看。如果找到了,它将返回值。如果没有找到,它会在可变的环境中继续查找。
推荐:javascript学习教程以上是JavaScript块级作用域实现原理的详细内容(图文详解)。请多关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。