Javascript 进阶 2-4 执行环境与执行堆叠

执行环境 Excution Context

http://img2.58codes.com/2024/20121770z4w2blcYkm.png

首先我们先来看到下方这张图:

http://img2.58codes.com/2024/20121770wvsreyYaXJ.png

当左方的 function 被呼叫的时候,就会创建一个 local 的作用域,并且限制在这个作用域中,this的指向后续的文章会做介绍。

所以根据上述的概念,如果我们一直反覆的执行同一个 function 它就会创造出很多个不同的执行环境

另外,除了函式可以创造出执行环境以外,全域本身也有自己的执行环境喔!

http://img2.58codes.com/2024/20121770CigRPGmCw9.png

全域执行环境的创建,是在你的浏览器一开启,或是node.js开始运作的时候就建立了

通常会有对应的全域变数 window(Chrome) 或是 global(NodeJS),并且 this 同时等同于 window 或是 global。

http://img2.58codes.com/2024/20121770oeAEQENEpH.png

接下来用实际的例子进行后面执行环境以及执行堆叠的概念吧!

function sayHi (name) {    var greeting = 'hi';    return greeting + ' ' + name;}function doSomething () {    var mom = '老妈';    console.log(1, sayHi(mom));}doSomething();

以上方这段程式码来说,如果我这边不执行 doSomething(); 的话,上方两个 function 的作用域也不会被创建喔!

这就呼应到一开始我们讲的,function 要被 呼叫 | 调用 的时候才会创建作用域。

那么执行上述的这段程式码的话,我们可以想像,作用域从

全域作用域创建 doSomething 的作用域创建变数 mom 并且赋值 '老妈'列印出后方的结果,同时执行 sayHi(mom) 的 function创建 sayHi 的作用域带入变数 name = '老妈'回传字串 'hi 老妈'回到 doSomething 的作用域console.log出结果回到全域作用域

这样的过程,我们的作用域就进行了执行堆叠的概念

http://img2.58codes.com/2024/20121770muR0yDXmrj.png

首先在第一步骤的时候,执行堆叠的状况是

http://img2.58codes.com/2024/20121770vifPvZG6Fx.png

http://img2.58codes.com/2024/201217701ti4VJLZxI.png

再来第二步骤,执行 doSomething 的时候创建对应的作用域

http://img2.58codes.com/2024/20121770g0SUrwmVIG.png

http://img2.58codes.com/2024/20121770wHwaPDlFx1.png

http://img2.58codes.com/2024/20121770u7nG3bL2h9.png

执行到 console.log 的时候,又执行了 sayHi 的 funciton, 创建了对应的作用域

http://img2.58codes.com/2024/20121770mTvznQDLid.png

http://img2.58codes.com/2024/20121770pAPY94MVQ2.png

http://img2.58codes.com/2024/20121770zUeqqdDBLR.png

等到 sayHi 的内容处理完之后,就离开 sayHi 的作用域,回到了 doSomething 的作用域

http://img2.58codes.com/2024/20121770zgCxURR0wb.png

http://img2.58codes.com/2024/20121770loI0CTUxCB.png

印出 console.log 的结果之后,同样的也离开 doSomething 的作用域,回到全域的作用域

http://img2.58codes.com/2024/20121770WMVxCZmafg.png

http://img2.58codes.com/2024/20121770ERa5Jir0JK.png

这样的状况就叫做,执行堆叠。

透过另外一段程式码,透过同一段 function 创建不同的 执行环境

function openTheDoor (num) {    return '开第 ' + num + ' 扇门';}function openDoors () {    openTheDoor(1);    for (var i = 2; i < 5; i++) {        openTheDoor(i);    }}openDoors();

透过上方的函式,作用域从全域 => openDoors => openTheDoor => openDoors => openTheDoor ....值到迴圈跑完以后,才从openTheDoor => 全域。

也可以自己用chrome的浏览器source的工具式式看喔~

本篇 作用环境 跟 执行堆叠 的讲解就到这~汪汪


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章