首页 > 语言 > JavaScript > 正文

javascript作用域链与执行环境详解

2024-05-06 15:19:22
字体:
来源:转载
供稿:网友

前言:这是笔者学习之后自己的理解与整理。如果有错误或者疑问的地方,请大家指正,我会持续更新!

作用域、作用域链、执行环境、执行环境栈以及this的概念在javascript中非常重要,本人经常弄混淆,这里梳理一下;

局部作用域函数内部的区域,全局作用域就是window; 作用域链取决于函数被声明时的位置,解析标识符的时候就先找当前作用域,再向外查找,直到全局,这样一个顺序;和函数在哪里调用无关; 执行环境就是函数可访问的数据和变量的集合,也就是函数的作用域链上的所有数据和变量; 执行环境栈就是根据代码执行顺序,各执行环境按照栈的形式逐层访问,并且用完了退出来扔掉;如果当前执行环境(存放当前作用域链里的数据和变量)找不到变量,那就是找不到了,不会往之前的那个执行环境查找,它和作用域链是不同的; this是一个对象,它取决于是谁执行的,谁执行那就是谁;(this的概念还是不太清楚,这里写的有点万金油,过两天再来修正) 

作用域

  JavaScript没有块级作用域的概念,只有函数级作用域:变量在声明它们的函数体及其子函数内是可见的。

  作用域就是变量和函数的可访问范围,控制着变量和函数的可见性与生命周期,在JavaScript中变量的作用域有全局作用域和局部作用域。

变量没有在函数内声明或者声明的时候没有带var就是全局变量,拥有全局作用域;

 <script type="text/javascript"> function test1(){  a = 1;//全局变量,只有在当前函数运行时,才有效  } test1(); console.log(a);//1 注意test1函数必须运行,不然找不到a </script>

全局变量可以当做window对象的属性用,他们是一样的; 

<script type="text/javascript">  var b = 1;//全局变量 console.log(b === window.b);//true 全局变量可以当做window对象的属性用,他们是一样的;</script>

window对象的所有属性拥有全局作用域,在代码任何地方都可以访问;

函数内部声明的变量就是局部变量,只能在函数体内使用,函数的参数虽然没有使用var但仍然是局部变量。

 <script type="text/javascript">    var c = 1;//全局变量//   console.log(d);//ReferenceError: d is not defined 引用错误,当前作用域就是最外层作用域,依然找不到d   function test2(d){    console.log(c);//1 全局变量,哪都可以访问;(先找当前作用域,找不到,就向外层作用域找,直到window最外层,找到了)    console.log(d);//3 形参是局部变量,只有当前作用域下可以访问   }   test2(3);  </script>

作用域链

  作用域链取决于函数被声明时的位置,解析标识符的时候就先从当前作用域开始找,在当前作用域中无法找到时,引擎就会在外层嵌套的作用域中继续查找,直到找到该变量,或抵达最外层的作用域(也就是全局作用域)为止;它的路线已经被定死了,和函数在哪里运行无关;

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选