执行环境就是当前Javascript代码被执行时所在的环境,Javascript在运行任何代码都是在执行环境运行,在执行环境的创建阶段以下三个都会被建立:
全域执行环境 : 不在任何函数内的代码,全都位於全域执行环境。他做了两件事,一是创建全域对象,在浏览器中就是window对象,二是将this指向这个全局对象,一个程序中,只能存在一个全域执行环境。
函数执行环境 : 每次呼叫函数时,都会为该函数创建一个新的执行环境。每个函数都有独立的执行环境,但是只有函数被调用时才会创建。
创建阶段 -> 执行阶段 -> 回收阶段
执行阶段
创建後,就开始执行代码,会完成赋值(创建阶段有创建变数了)
回收阶段
函数调用完毕後,等待垃圾回收器回收执行环境。
用一个例子来说明:
let a = 10
function out() {
let b = 20;
function inner() {
let c = 30;
console.log(a+b+c);
}
inner();
}
out();
上面的代码会历经底下过程:
其中每个执行环境都是依序进入call stack中,执行完毕回收後就会离开call stack。
变数对象(VO)是一个类似容器的对象,与作用域、作用域链息息相关。
关於第三点举个例子:
function test() {
function inner() {
console.log("inner");
}
var inner = 123
console.log(inner)
}
test() // 123
按照第三点的规则,inner属性名称已经声明过了,所以底下var所声明的是会跳过的,那为什麽执行结果最後还是123呢?因为这三条规则只有在变数对象的创建时适用,而赋值123是发生在执行阶段,所以结果自然是123,这种现象很让人头疼,其实也是因为var声明的变数允许重复命名所导致的,若使用let来声明就可以避免这种状况(上面的例子改为let,则会出现'func' has already been declared)。
执行环境还没进入执行阶段时,变数对象中的属性都不能被访问。但是进入执行阶段,激活为活动对象就可以被访问,然後开始执行执行阶段的操作。
定义 : 多个执行环境(作用域)的变数对象串联起来组成的链表就是作用域链。
作用域可以比拟为蒸笼,最底下一层为全局AO,里面的蒸汽(变数与函数的可见性),可以渗透整个蒸笼,底层之上的其他蒸笼层的蒸气只能往上,也就是只能影响上面的蒸笼层。
作用域的顶端一定是当前作用域(local scope)对应的变数对象,底端一定是全局作用域对应的变数对象(全局VO)。
根据以上的了解,查找变数与函数时JS引擎会从离它最近的作用域开始查找,也就是离它最近的变数对象(VO)开始查找,找不到就往上一层VO直到全域找到为止。
>>: [Day 08 - CSS Architecture] CSS设计模式,摆脱义大利面代码
到了铁人赛最後一天,其实自己一开始就从没设想如果完成了铁人赛会有什麽样的心情,只想着就算没梗没题材,...
回想之前在某家公司,人资在公司新人训送给大家的一句话:「选择比努力还重要」 当时的我一直无法体会这句...
元件介绍 Table 顾名思义就是一个表格元件,用来整齐的显示行列数据。 参考设计 & 属性...
今天要来介绍後端,所谓的後端简单来说就是负责资料的部分,因为有关於资料都会是他们处理,而要让资料显示...
Java,我相信如果去查维基百科,「物件导向」这4个字一定会在叙述的第一行。 换言之,在Java的世...