通俗理解JS执行环境
2018-03-06 22:50
330 查看
“执行环境”,听到这个名词,可能变得很头大!并且不少文献中又叫做“执行上下文”,不过实际上是一个东西。书籍和资料中也往往讲得特别复杂,这可是JS中一个难以理解得地方啊,别急,本篇文章尝试用通俗浅显的语言阐述这个概念。
我们在浏览器控制台输入:
结果是输出1,显然a变量是window对象的一个属性。
那么我问你:a变量的执行环境是什么呢?
相信你不难回答:就是window对象啊!的确,你说得很对,window对象就是a变量的执行环境,它叫做全局执行环境,因为它是最外围的一个执行环境。这里,a默认就是在全局执行环境中定义的,因此a和window.a是同一个。
我们再看下一个例子:
这个例子中,a是定义在函数内部的,那么a的执行环境便是函数执行环境(output)。
如果你在window中输入:
是会报错的,因为a只在函数output中可见。
但你输入:
却会正常显示函数,因为函数output的执行环境是window,在window中当然可以显示呀!
window环境将控制权交给output函数环境,output环境就成为了主场。
那么,实际上背后搞了些啥呢?
JS中有个东西叫做执行环境栈,或者叫做执行上下文栈,不知道栈是啥该补一下数据结构了。
就像堆箱子一样,全局执行环境被放在执行环境栈的最下面。当运行到output函数,这个函数的执行环境也被打包成一个箱子‘堆’在全局执行环境的上面。如果我要继续运行全局环境中的其他函数,就像要拿最下面箱子的东西一样,必须先把output函数执行完。形象地说,就像把上面的箱子拿开,然后才能动下面的箱子。
一、例子解说执行环境
先看一个例子:我们在浏览器控制台输入:
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函数执行完。形象地说,就像把上面的箱子拿开,然后才能动下面的箱子。
相关文章推荐
- 我所理解的JS执行环境和作用域链
- js的执行环境及作用域
- js 回调函数中 this对象的执行环境(上下文)
- js 函数的执行环境和作用域链的深入解析
- js对象字面量属性间相互访问的问题 和 这个问题与执行环境的关系
- js中(function(){…})()立即执行函数写法理解
- 理解执行环境和理解垃圾收集
- js中立即执行函数写法理解
- 前端高质量知识(二)-JS执行上下文(执行环境)详细图解
- js 执行环境(上下文)、作用域链
- 理解,JS全局预处理与执行
- js之执行环境(作用域)与作用域链深入剖析2
- js中(function(){…})()立即执行函数写法理解
- js中(function(){…})()立即执行函数写法理解
- javascript执行环境以及作用域链的理解
- 【译】深入理解JavaScript系列:1. 执行环境
- JS立即执行函数理解
- 深刻理解js执行原理和闭包
- js中(function(){…})()立即执行函数写法理解
- 理解 ECMAScript 262 5th 执行环境一些概念