96SEO 2026-08-14 13:37 2
接前两天的文章:
昨天你已经理解了:

var 变量提高GO/AO❗️使用者痛点:很多同学在实际编码时仍然混淆这两者,导致调试时找不到变量来源。
今天继续推进两个主要知识点:
代码示例:
var a = function fn {
var b =
console.log
console.log
}
fn
请不要运行。按照下面顺序回答:
GO 里面有什么?再看写出,
GO = {}
fn 时创建函数执行上下文。再看写出,
AO = {}
console.log
JS 引擎的查找顺序是?再看请选择,
请写出完整查找过程。
var a = function fn {
var b =
function test {
var c =
console.log
console.log
console.log
}
test
}
fn
不要运行。请回答以下问题:
console.log变量 c 从哪里找到?请描述查找方法,
示例格式的观点是,
AO ↓ AO ↓ GO
一样给出完整的查找方法。说起来,
从现在开始,每看一个函数,都先在脑子里画出它的层级关系。例如:
GO ↓ AO ↓ AO
# 为什么这么做?#
* 所有高级概念都建立在这套「执行上下文 + 作用域链」模型之上!*
第一题的观点是,GO:{ a:,fn:function fn {}}
再看AO,{ a:,b:}
a 会现在 AO 找,发现找不到所以去 GO 找到了 a:,所以 console.log 会输出1
至于第二题,console.log 直接在 test 的 AO 中找,并找到了输出 3
console.log 先在 test 的 AO 中找,找不到,就去 fn 的 AO 找,找到了输出 2
console.log 先在 test 的 AO 中找,找不到,就去 fn 的 AO 找,也找不到,去 GO 找,找到。输出 1
Code:
var a = function fn {
var b =
console.log
console.log
}
fn
You wrote:
GO = { a:,fn: function fn {}}
✅ 结果是对的,但完整流程应区分"创建阶段"/"执行阶段".
GO = { a: undefined,fn: function fn {}}
The assignment of a=…
` occurs here:
a = /* 函数体 */
GO = { a: /* 函数引用 */。fn: function fn {}}
AO = { a:,b: }
⚠️ 错误点:在函数内部只有 `b` 被提高;`a` 是全局变量,不会出现在 AO 中。
AO = { b:
执行阶段
b =
结果变为
AO ={ b : /* 实际值 */ }
查找
-
您写的是 :
> **AO** 未找到 → **GO** 找到 ✅ 正确。
-
实际引擎行为类似 :
js
AO ↓ 没有 a → GO ↓ 找到 a → 返回值
第二题批改
Code :
var a=function fn{var b=function test{var c=console .log;console .log;不过,console .log }test}fn
console .log
至于您答。“直接在 test 的 AO 找到”。✅ 正确,
AO ↓找到 c
再看您答,“test 的 AO 没有 → fn 的 AO 找到”。✅ 正确,
AO ↓AO↓找到 b
今日加练
不要运行 :
var a=function fn{var b=function test{console .log;console .log }return test}var f=fn;话说回来,f
问题1 : 执行完 var f = fn 后fn 的 AO 会不会被销毁?
菜鸟回答——已接近满分
问题1 :不会销毁 …问题2 :解析阶段 ,
GPT 分析与纠正
问题1这方面,fn 的 AO 是否会被回收?
说到您答,“不会”。怎么说呢,✅ 正确,但需解释原因。原因var f = fn 把内部函数 test 返回并保存为全局引用 f。因为 test 持有对 fn 中变量 b 的引用,JS 引擎会把 fn 的 AO 保存不会被垃圾回收。
从问题2来看,您的 GO 写错了
错误代码
js
GO = { a: undefined,f: function fn {} }
正确写法
js
GO = { a: undefined。fn: function fn {},f: undefined }
因为 var a,function fn{} 与 var f 都会提高。
正确写法
1️⃣ 给 a 赋值后
js
GO = { a: /* 函数引用 */,fn: function fn {},f: undefined }
2️⃣ 执行 f = fn 返回内部函数 test 并赋值给 f
js
GO = { a: /* 函数引用 */,fn: function fn {}。f: function test{...} }
AO – 创建 & 执行阶段
创建阶段
js
AO = { b: undefined,test: function test{ } }
执行阶段
js
AO = { b: /* 实际值 */,test: function test{ } }
创建阶段
js
AO = {}
执行阶段
js
AO = {}
因为内部没有任何声明,所以空对象。其实,
查找
AO → 没有 c
→ 返回错误或未定义
查找
AO → 没有 b
→ AO → 找到 b → 返回
查找
AO → 没有 a
→ AO → 没有 a
→ GO → 找到 a → 返回
主要概念提醒
-
词法作用域决定作用域链 — 函数定义时所在的作用域决定了后续查找顺序。而不是调用位置,
-
即使把返回函数放进计时器、对象属性甚至跨窗口调用,它们的 作用域链始终保持不变
function fn{ var b;return function test{ console.log;} }
var f = fn;// 此时形成 GO ↓ AO ↓ AO
setTimeout;// 调用位置改变,但链条不变
验收题
不要运行 :
var a=function fn{
var a=
function test{
console .log
}
return test}
var f=fn
a=f
-
请推导输出多少?
-
给出完整查找方法
菜鸟最终答案——已接近满分
从解析阶段来看,GO:{a:undefined,fn:function fn{}。f:undefined}
从执行阶段来看,... // 略述过程
至于最终输出,200
再看查找方法,AO->AO->GO
主要想说明帮助学习 JavaScript 执行上下文与作用域链,以解决 “总是搞不清变量来源” 等常见痛点。话说回来,如有疑问,请留言交流!🚀🚀🚀
<\/footer\>
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback