闲聊
菜鸟感觉上班之后,真的很少有时间可以学习,学习也是 ------ 收藏等于学会、看过等于精通!

菜鸟现在的公司,之前还是非常爽的,当时就一个前端一个后端,活比较少,每天一半时间都可以学习,基本就是上午干完活,下午就看B站大学,当时很学了一点东西,都是边看视频边做笔记。
这些都是当时的成果:
2.www.bilibili.com/opus/934644... 
3.www.bilibili.com/opus/933463... 
4.www.bilibili.com/opus/785846... 
还有不少就不一一列举了,大家也可以看出来,我是看 满神 长大的孩子!

但是现在不太一样了,现在团队到了4个后端,4个前端,其中一个后端是leader,菜鸟则是leader的副手,而且要维护和开发的系统也变多了。也不说没有时间学习,只是感觉上班看视频学习影响不好(其实也很怕,之前是因为电脑屏幕对着没有人的地方),而且总是会被打断,因为要回复群里的问题、沟通需求等,很难受!
菜鸟每天都在思考怎么变强,怎么赚钱,但是发现干啥都不如好好把工作做好,写文章只能玩玩(没有技术,根本没人关注,虽然菜鸟自认为写的文章还行),不能养活自己,自己太菜了!
菜鸟每次想提升都会去问一下GPT,我应该怎么搞,今天突然开窍了,为什么不直接让GPT当老师,每天给我出题,查漏补缺?
大家感兴趣也可以试试,其它AI也行,菜鸟是比较信任GPT所以用的GPT!
菜鸟发给GPT的内容如下:
- 在公司,怎么用零散的时间学习提升自己
- 要进阶版计划
- 但是我只会前端
- 给我一套"能拉开差距"的学习系统
- 你可以每天定时给我推送你的这些问题吗?让我每天都可以学习1-2个知识,且理解透彻,而且你要按照你上面的安排来推送
这里GPT是不能推送的,只能我有空的时候发送:今日训练,去触发!
今日训练
大家感兴趣可以每天和菜鸟一起做这些题!
1、JS代码是从哪一行开始执行的?
下面三种说法,哪个更接近真实机制?
A. 从上到下逐行执行
B. 先编译再执行
C. 运行时逐行解析执行
D. 浏览器随机执行
👉 先选一个,并简单说理由(不用长)
2、代码预测
直接写执行结果:
css
console.log(a)
var a = 10
console.log(a)
👉 请回答两点:
- 输出是什么?
- 为什么?
3、再升级一点
javascript
console.log(foo)
function foo() {
return 123
}
console.log(foo())
👉 请回答:
- 第一行输出什么?
- 第二个 console 输出什么?
- 为什么 function 和 var 不一样?
菜鸟的回答
问题1,C,因为浏览器会请求到js文件,其需要一行一行进行读取运行(所以是运行时逐行解析),写代码阶段不会逐行解析并判断错误,可能会有变量的声明提升、异步函数导致其不像逐行解析
问题2,undefined 10,因为变量声明提升
问题3,输出: function foo() { return 123 }
123
function和var都有提升,但是function会整体提升,var的赋值不会提升
GPT 批改
很好,你这三题其实已经暴露出你现在处在一个非常典型的阶段:
"有经验但机制理解是碎片化的前端" → 正在往"能解释运行机制"过渡
🧠 一、你的回答整体评价
✔ 正确部分(你已经有基础了)
✅ Q2(var + 提升)
你答对了核心结果:
undefined10
✔ 说明你知道:
- var 提升
- 变量初始化 vs 声明分离
⚠️ Q3(function vs var)
你说:
function整体提升
✔ 方向是对的
但还缺一个关键点:执行阶段绑定机制不同
❌ 最大问题(重点)
❌ Q1 你的理解是"运行时逐行解释"
你选 C:
运行时逐行解析
这个是典型误区(90%前端都会错)
🚨 二、关键纠错(今天最重要的知识)
❗ JS真实执行模型是:B
先编译(创建阶段),再执行(执行阶段)
不是逐行解释执行。
🧩 两阶段模型(必须记住)
🟡 阶段1:创建阶段(编译期)
做三件事:
- 变量声明(var)
- 函数声明提升
- 作用域创建(VO / AO)
👉 这一阶段不会执行代码
🔵 阶段2:执行阶段
从上往下执行:
- 赋值
- 调用
- 运算
🧠 三、用你的题重新解释
🔥 Q2 本质流程
css
console.log(a)
var a = 10
console.log(a)
编译阶段:
ini
a = undefined(已经存在)
执行阶段:
- log(a) → undefined
- a = 10
- log(a) → 10
⚠️ 四、你现在最大的问题
不是不会答案,而是:
❌ 把"执行顺序"理解成"逐行解释"
实际上JS是:
✔ "先建结构,再跑流程"
🧠 五、Q3深度纠正(关键提升点)
javascript
console.log(foo)
function foo() {
return 123
}
console.log(foo())
✔ 编译阶段:
function foo:
- 整体进入作用域
- 已经是"可调用函数"
✔ 执行阶段:
- log(foo) → 打印函数本体
- foo() → 执行函数 → 123
⚠️ 关键区别(你漏掉的)
| 类型 | 提升行为 |
|---|---|
| var | 声明提升 = undefined |
| function | 整体提升 = 可执行函数 |
🧠 六、你现在的真实水平判断
我直接给你定位:
✔ L2.5(向 L3 过渡阶段)
特点:
- 知道提升
- 知道结果
- 但"运行模型不稳定"
🚀 七、今天你必须带走的"核心一句话"
记住这个(非常重要):
JS不是逐行执行,而是"先创建作用域结构,再执行代码"
🧪 八、今天加一个强化训练(很关键)
再做一题(你先答):
css
console.log(a)
let a = 10
👉 问你三个问题:
- 会输出什么?
- 和 var 有什么区别?
- 为什么会这样?
菜鸟回答
会报错,let 有作用域,没有声明提升
GPT 批改
你这题结果是对的(会报错) ,但原因你说得还不够准确,这里是关键提升点。
🧠 先给结论(标准答案)
css
console.log(a)
let a = 10
❌ 输出结果
报错:ReferenceError: Cannot access 'a' before initialization
🚨 核心纠正(非常重要)
你说:
let 没有声明提升
❌ 这个是错误理解(重点)
🧠 真相是:
let / const 也会"提升",但不允许访问
这叫:
🔥 暂时性死区(TDZ:Temporal Dead Zone)
🧩 一、JS真实行为(和你理解的完全不同)
🟡 编译阶段(创建阶段)
其实已经发生了:
css
a 被"创建"在作用域中
但处于"未初始化状态"
🔵 执行阶段
javascript
console.log(a) // ❌ 不能访问
let a = 10
⚠️ 二、关键区别(这是本质)
| 变量类型 | 是否提升 | 是否可访问 | 初始值 |
|---|---|---|---|
| var | ✔ 提升 | ✔ 可访问 | undefined |
| let | ✔ 提升 | ❌ 不可访问(TDZ) | 无 |
| const | ✔ 提升 | ❌ 不可访问(TDZ) | 无 |
🧠 三、你现在的误区(重点)
你刚才说:
let 没有声明提升
❌ 实际问题是:
你把"不能访问"误认为"没有提升"
🧠 四、正确理解(必须记住)
一句话版本:
let/const 也提升,但进入了"暂时性死区",直到执行到声明行才可访问
🧪 五、为什么设计 TDZ?(关键理解)
如果没有 TDZ,会发生:
css
console.log(a)
let a = 10
变成:
- undefined(像 var 一样)
👉 JS设计者故意避免这种"脏状态"
🧠 六、把三种情况统一理解(核心模型)
🟡 var
javascript
创建 → 初始化(undefined) → 可访问
🟠 let/const
scss
创建 → 暂时不可访问(TDZ) → 初始化 → 可访问
🔵 function
scss
创建 → 初始化(函数体) → 可直接调用
🚀 七、你今天真正升级的点
你已经从:
❌ "记规则"
升级到:
✔ "理解执行模型差异"
