分析如下代码的输出结果
题目一
var message = "全局作用域"
function foo() {
console.log(message);
}
function bar() {
var message = "bar中"
foo()
}
bar()
解答
-
在编译阶段,浏览器会创建一个全局对象GO,该对象包含重多属性如,String,Number等,另外会声明全局对象message,定义函数bar、foo,如图:
image.png -
编译完成后开始执行,创建全局执行上下文,包含vo对象和具体执行的代码,执行完第一行后,如图:
image.png -
函数继续执行,执行到第12行时,开始执行函数bar,创建一个函数执行上下文,包含指向AO(activation object)的VO对象
image.png -
继续执行
image.png -
继续执行,创建新的函数执行上下文,包含一个vo对象指向新的AO对象(图中为AO2),在foo中并没有定义或赋值,只是打印对应的值
image.png
结论
这里并没有打印bar中,是因为函数的作用域在编译的时候就已经确定了,跟执行的顺序是没有关系的
另外的一些题
image.png- 其中
var a = b = 100
相当于var a = 100; b = 100
在JS中相当于定义了局部变量a
和全局变量b
网友评论