上一篇我们讲到在全局环境下的代码段中,执行上下文环境中有如何数据:
变量、函数表达式——变量声明,默认赋值为undefined;
this——赋值;
函数声明——赋值;
function fn(x){
console.log(arguments);
console.log(x);
}
fn(10);
[10, callee: ƒ, Symbol(Symbol.iterator): ƒ]0: 10callee: ƒ fn(x)arguments: nullcaller: nulllength: 1name: "fn"prototype: {constructor: ƒ}__proto__: ƒ ()[[FunctionLocation]]: VM337:1[[Scopes]]: Scopes[1]length: 1Symbol(Symbol.iterator): ƒ values()__proto__: Objectconstructor: ƒ Object()hasOwnProperty: ƒ hasOwnProperty()isPrototypeOf: ƒ isPrototypeOf()propertyIsEnumerable: ƒ propertyIsEnumerable()toLocaleString: ƒ toLocaleString()toString: ƒ toString()valueOf: ƒ valueOf()__defineGetter__: ƒ __defineGetter__()__defineSetter__: ƒ __defineSetter__()__lookupGetter__: ƒ __lookupGetter__()__lookupSetter__: ƒ __lookupSetter__()get __proto__: ƒ __proto__()set __proto__: ƒ __proto__()
10
全局代码的上下文环境数据内容为:
普通变量(包括函数表达式),
如: var a = 10;声明(默认赋值为undefined)
函数声明,
如: function fn() { }赋值
this
赋值
如果代码段是函数体,那么在此基础上需要附加:
参数
赋值
arguments
赋值
自由变量的取值作用域
赋值
给执行上下文环境下一个通俗的定义——在执行代码之前,把将要用到的所有的变量都事先拿出来,有的直接赋值了,有的先用undefined占个空。
讲完了上下文环境,又来了新的问题——在执行js代码时,会有数不清的函数调用次数,会产生许多个上下文环境。这么多上下文环境该如何管理,以及如何销毁而释放内存呢?下一节将通过“执行上下文栈”来解释这个问题。
网友评论