您的位置:首页 > Web前端 > JavaScript

通俗理解JS执行环境

2018-03-06 22:50 330 查看
“执行环境”,听到这个名词,可能变得很头大!并且不少文献中又叫做“执行上下文”,不过实际上是一个东西。书籍和资料中也往往讲得特别复杂,这可是JS中一个难以理解得地方啊,别急,本篇文章尝试用通俗浅显的语言阐述这个概念。

一、例子解说执行环境

先看一个例子:

我们在浏览器控制台输入:

var a=1;
console.log(window.a);
console.log(a);


结果是输出1,显然a变量是window对象的一个属性。

那么我问你:a变量的执行环境是什么呢?

相信你不难回答:就是window对象啊!的确,你说得很对,window对象就是a变量的执行环境,它叫做全局执行环境,因为它是最外围的一个执行环境。这里,a默认就是在全局执行环境中定义的,因此a和window.a是同一个。

我们再看下一个例子:

function output(){
var a=1;
console.log(a);
}


这个例子中,a是定义在函数内部的,那么a的执行环境便是函数执行环境(output)。

如果你在window中输入:

console.log(a);


是会报错的,因为a只在函数output中可见。

但你输入:

console.log(output);


却会正常显示函数,因为函数output的执行环境是window,在window中当然可以显示呀!

二、执行环境怎么工作?

我们知道,output函数是在window环境中。当程序运行output函数的时候,你应该已经猜到了:

window环境将控制权交给output函数环境,output环境就成为了主场。

那么,实际上背后搞了些啥呢?

JS中有个东西叫做执行环境栈,或者叫做执行上下文栈,不知道栈是啥该补一下数据结构了。

就像堆箱子一样,全局执行环境被放在执行环境栈的最下面。当运行到output函数,这个函数的执行环境也被打包成一个箱子‘堆’在全局执行环境的上面。如果我要继续运行全局环境中的其他函数,就像要拿最下面箱子的东西一样,必须先把output函数执行完。形象地说,就像把上面的箱子拿开,然后才能动下面的箱子。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: