发表于: 2019-03-23 22:35:29

1 609


今天完成的事情,今天铺地毯耽误了点时间,准备了一下小课堂,JavaScript的数据类型由哪些,和常用用法,然后感觉数据类型没有什么难度,就打算在讲一下JavaScript的作用域,和执行环境。


简单的讲一下,关于JavaScript的作用域和,执行环境。



首先我们得知道,js中,执行环境与作用域是两个不同的概念。js函数的每次调用,都由与之密切相关的,作用域与执行环境。从根本上来说,作用域是基于函数的,而执行环境是基于对象的(即全局执行环境,就是基于window对象)。换句话说,作用域涉及到被调用的函数的变量的访问,且不同的调用场景是不一样的,执行环境则是this的关键值,,它是拥有当前所执行代码的对象的引用;每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中;虽然我们编写的代码无法访问这个对象,但解析器在处理数据时会在后台使用它。


官方的解释总是摸不着头脑。执行环境涉及到我们对变量,以及函数的访问,而作用域则是基于函的,执行环境基于的是window对象,最后返回的一定是window全局对象。



执行环境定义了函数或者对象有权访问的其他数据。



当JavaScript运行的时候,他会默认进入全局环境,从此刻开始,每调用一次函数的话,就会创建一个新的局部环境,当执行流,进入了函数时,函数的环境就会被推入一个环境栈中,在函数执行完之后就会,弹出环境,保留其中的变量和函数的定义会直接被销毁。当程序退出的时候,全局环境才会被销毁。


js执行环境的特点时

单线程

唯一全局环境
局部执行环境没有限制

每次某个函数被调用的时候就会创建新的局部执行环境,当一个函数被调用n次的时候,也会创建不同的执行环境。


当代码在执行环境中执行的时候,会创建变量对象,一个作用域链,scope chain,作用域链的用途就是保证执行环境可以访问有权访问的所有变量,以及对函数进行有序的访问。



作用域链包含了执行环境栈中对应的变量对象,通过对象作用域链,可以决定变量的访问和标识符的解析;作用域链的前端始终都是当前执行的代码所在环境的变量对象,如果这个环境是函数则将其活动对象作为变量对象,活动对象在一开始时只包含一个变量即arguments对象(这个对象在全局环境中是不存在的);作用域链中的下一个变量对象来自包含(外部)



达成全局作用域的条件是,未定义直接赋值的对象,在最外面的函数,在函数外面定义的变量,windows对象拥有全局作用域。


而局部作用域:是函数内部的作用域,一般只在固定的代码片段内可访问到,有时候也成为函数作用域;这里引申一下变量的搜索机制:先搜索局部变量,如果没找到,往上一层查找,直到搜索全部变量,如果都没找到,返回undefined


在每个执行环境中,内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数

全局执行环境的变量对象始终都是作用域链的最后一个对象


自己的理解就是,执行环境就是定义如何访问变量,与函数。当一个自运行函数运行的时候,执行环境流会推入一个执行环境栈里面进行保存,然后当自执行函数执行完了之后,环境就会弹出,保存的值就会销毁。

var color = "blue";
function changeColor(){
   var anotherColor = "red";
   function swapColors(){
       var tempColor = anotherColor;
       anotherColor = color;
       color = tempColor;
       // 这里可以访问color, anotherColor, tempColor
   }
   // 这里可以访问color anotherColor,但是不能访问 tempColor
   swapColors();
}
changeColor();
// 这里只能访问color
console.log("Color is now " + color);


这串代码包括了全局环境,只有一个color,和函数 changecolor。

changecolor函数可以访问,外面的全局变量,和自身的所有变量。

;swapcolor()函数的局部环境中具有一个变量tempcolor,在该函数内部可以访问上面的两个环境(changecolor和window)中的所有变量,因为那两个环境都是它的父执行环境。



今天的收获,看了几个小时的JavaScript的执行环境与作用域,现在还是一头雾水。下次小课堂就讲这个把,收获,对执行环境与作用域的一些基本理解把。


明天任务,js4。




返回列表 返回列表
评论

    分享到