js块级作用域和函数作用域,块级作用域和函数作用域

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: