博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js的执行环境与作用域
阅读量:4098 次
发布时间:2019-05-25

本文共 1849 字,大约阅读时间需要 6 分钟。

4、执行环境与作用域

  • 变量或函数的上下文决定了它们可以访问哪些数据,以及它们的行为。每个上下文都有一个关联的变量对象(variable object),而这个上下文中定义的所有变量和函数都存在于这个对象上。
  • 全局上下文是最外层的上下文。在浏览器中,全局上下文就是我们常说的 window 对象,因此所有通过var 定义的全局变量和函数都会成为 window 对象的属性和方法。使用 let 和 const 的顶级声明不会定义在全局上下文中,但在作用域链解析上效果是一样的。上下文在其所有代码都执行完毕后会被销毁,包括定义在它上面的所有变量和函数(全局上下文在应用程序退出前才会被销毁,比如关闭网页或退出浏览器)。
var person = 'lisa';console.log(window.person) // lisaconst person2 = 'lily';console.log(window.person2) //ERROR 报错
  • 每个函数调用都有自己的上下文。当代码执行流进入函数时,函数的上下文被推到一个上下文栈上。在函数执行完之后,上下文栈会弹出该函数上下文,将控制权返还给之前的执行上下文。ECMAScript程序的执行流就是通过这个上下文栈进行控制的。
  • 上下文中的代码在执行的时候,会创建变量对象的一个作用域链(scope chain)。这个作用域链决定了各级上下文中的代码在访问变量和函数时的顺序。代码正在执行的上下文的变量对象始终位于作用域链的最前端。如果上下文是函数,则其活动对象(activationobject)用作变量对象。活动对象最初只有一个定义变量:arguments 。(全局上下文中没有这个变量。)作用域链中的下一个变量对象来自包含上下文,再下一个对象来自再下一个包含上下
    文。以此类推直至全局上下文;全局上下文的变量对象始终是作用域链的最后一个变量对象。
  • 代码执行时的标识符解析是通过沿作用域链逐级搜索标识符名称完成的。搜索过程始终从作用域链的最前端开始,然后逐级往后,直到找到标识符。(如果没有找到标识符,那么通常会报错。)
var color = "blue";function changeColor() {
if (color === "blue") {
color = "red"; } else {
color = "blue"; }}changeColor();console.log(color) // 'red'
  • 对这个例子而言,函数 changeColor() 的作用域链包含两个
    对象:一个是它自己的变量对象(就是定义 arguments 对象的那
    个),另一个是全局上下文的变量对象。这个函数内部之所以能够访
    问变量 color ,就是因为可以在作用域链中找到它。
color = "blue";function changeColor() {
let anotherColor = "red"; function swapColors() {
let tempColor = anotherColor; anotherColor = color; color = tempColor; console.info("tempColor",tempColor) //red console.info("anotherColor",anotherColor) // blue console.info("color",color) // red // 这里可以访问color、anotherColor和tempColor } // 这里可以访问color和anotherColor,但访问不到tempColor swapColors();}// 这里只能访问colorchangeColor();
  • 内部上下文可以通过作用域链
    访问外部上下文中的一切,但外部上下文无法访问内部上下文中的任
    何东西。上下文之间的连接是线性的、有序的。每个上下文都可以到
    上一级上下文中去搜索变量和函数,但任何上下文都不能到下一级上
    下文中去搜索。

注意 函数参数被认为是当前上下文中的变量,因此也跟上下文中

的其他变量遵循相同的访问规则。

转载地址:http://udqii.baihongyu.com/

你可能感兴趣的文章
一种函数指针的运用
查看>>
Win32程序之进程的原理
查看>>
C++虚函数原理
查看>>
MySQL的索引
查看>>
今天,Python信息量很大!
查看>>
Flash 已死,Deno 当立?
查看>>
编程差的程序员,90%都是吃了数学的亏!骨灰级开发:方法不对,努力也白费...
查看>>
编程差的程序员,90%都是吃了数学的亏!骨灰级开发:方法不对,努力也白费...
查看>>
都无代码了,还要程序员吗?
查看>>
程序员:凭自己能力吃饭,有什么理由瞧不起?
查看>>
面试想拿 10K,HR 说我只配7k?
查看>>
副业过万的程序员都知道的网站有哪些
查看>>
那些人生“开挂”的程序员,都在干什么?
查看>>
影响科学圈的那些计算机代码
查看>>
乐视视频 App 图标改为“欠 122 亿”,网友:我在别家分红包,却在你家随份子!...
查看>>
乔布斯18岁求职信拍卖价22.24万美元,值吗?
查看>>
为何程序员总喜欢写技术博客,看完恍然大悟...
查看>>
假如计算机是中国人发明的,那代码应该这么写
查看>>
科技公司最爱的 50 款开源工具,你都用过吗?
查看>>
触目惊心:比特币到底消耗了多少能源?
查看>>