-
全局作用域(GO)初始化
- 变量
n被声明并赋值为100。 - 函数
foo被声明,其内部代码为n = 200。
javascript GO: { n: 100, foo: 函数对象 } - 变量
-
调用
foo()时的作用域链- 执行
foo()时,进入函数作用域,创建活动对象(AO)。 - 函数内部试图访问变量
n。由于函数作用域内未声明n,沿着作用域链向全局作用域查找。
javascript AO(函数 foo 的活动对象): 无局部变量 n - 执行
-
修改全局变量
n- 在全局作用域中找到
n,将全局n的值从100修改为200。
javascript GO: { n: 200, foo: 函数对象 } // 全局 n 被修改 - 在全局作用域中找到
-
最终输出结果
console.log(n)访问全局作用域的n,输出修改后的值200。
-
全局作用域(GO)初始化
- 变量
n被声明并赋值为100。 - 函数
foo被声明,其内部代码包含变量提升逻辑。
javascript GO: { n: 100, foo: 函数对象 } - 变量
-
调用
foo()时的执行上下文-
变量提升阶段:
函数内部声明var n = 200的变量n被提升至函数顶部,初始值为undefined。javascript AO(函数 foo 的活动对象): { n: undefined } -
代码执行阶段:
-
第一个
console.log(n):
当前作用域(AO)中存在n,值为undefined,输出undefined。 -
执行
n = 200:
修改 AO 中的n为200。javascript AO: { n: 200 } -
第二个
console.log(n):
从 AO 中读取n,输出200。
-
-
-
函数执行完毕后的全局输出
console.log(n)访问全局作用域(GO)的n,值仍为100。
-
全局作用域(GO)初始化
- 变量
a被声明并赋值为100。 - 函数
foo被声明,其内部代码包含变量提升逻辑。
javascript GO: { a: 100, foo: 函数对象 } - 变量
-
调用
foo()时的执行上下文-
变量提升阶段:
函数内部var a = 100的声明被提升至函数顶部,初始值为undefined。javascript AO(函数 foo 的活动对象): { a: undefined } -
代码执行阶段:
- 执行
console.log(a):
当前作用域(AO)中存在a,值为undefined,因此输出undefined。 - 函数提前返回:
由于图示中存在return语句,后续的var a = 100的赋值操作未执行,AO 中的a保持undefined。
- 执行
-
-
全局输出
console.log(a)- 访问全局作用域(GO)中的
a,值仍为100。
- 访问全局作用域(GO)中的
补充:在js引擎里边,如果变量没有被声明,会被放到全局对象里边