feat: 变量提升与作用域

master
LCJ-MinYa 3 days ago
parent 38c383eae7
commit 29cf0b8962

@ -198,6 +198,10 @@ const titleArr = [
key: 'jsEventLoop', key: 'jsEventLoop',
title: 'js事件循环', title: 'js事件循环',
}, },
{
key: 'jsHoistingScope',
title: 'js中变量提升与作用域',
},
]; ];
// @/views/demo/**/*.vue // @/views/demo/**/*.vue

@ -0,0 +1,20 @@
<template>
<div
class="markdown-body"
v-html="htmlStr"
/>
</template>
<script setup>
import { ref } from 'vue';
import { marked } from 'marked';
import { getMarkdownContent } from '@/utils/tools';
const htmlStr = ref('');
// getMarkdownContent public
// move-md-plugin src .md public/md/
getMarkdownContent('./md/jsHoistingScope.md').then((res) => {
htmlStr.value = marked(res);
});
</script>

@ -0,0 +1,83 @@
# JS 变量提升与作用域 (Hoisting & Scope)
## 知识点总结
### 1. 变量提升 (Hoisting)
JavaScript 代码在执行前会先进行编译。在编译阶段,变量和函数的声明会被移动到其所在作用域的顶部。
* **var 声明**: 变量会被提升,但赋值不会。初始值为 `undefined`
* **let/const 声明**: 也会被提升,但在声明之前访问会触发“暂时性死区 (TDZ)”。
* **函数声明**: 整个函数体都会被提升(函数声明优先于变量声明)。
### 2. 作用域 (Scope)
作用域决定了代码中变量和其他资源的可见性。
* **全局作用域**: 脚本中任何地方都能访问。
* **函数作用域**: 变量仅在函数内部可见。
* **块级作用域**: `let``const` 引入。变量仅在 `{}` 块内可见。
### 3. 作用域链 (Scope Chain)
当在一个作用域中使用变量时JavaScript 引擎会首先在当前作用域查找,如果没有找到,就向上一级作用域查找,直到找到或到达全局作用域。
## 代码演示
### 收集题目
```javascript
let outerValue = 'outer'; //let声明的变量不会挂在全局window上
function outer() {
function inner() {
const arrowFunc = () => console.log(this.outerValue);
arrowFunc();
}
inner();
}
outer();
// undefined
```
```javascript
var outerValue = 'outer';
function outer() {
function inner() {
const arrowFunc = () => console.log(this.outerValue);
arrowFunc();
}
inner();
}
outer();
// outer
```
### 变量提升演示
```javascript
console.log(a); // undefined
var a = 1;
try {
console.log(b); // ReferenceError
let b = 2;
} catch (e) {
console.log(e);
}
foo(); // "hello"
function foo() {
console.log("hello");
}
```
### 作用域链演示
```javascript
var x = 10;
function outer() {
var y = 20;
function inner() {
var z = 30;
console.log(x + y + z); // 60
}
inner();
}
outer();
```

@ -114,7 +114,7 @@ const getThemeColor = (index: number, type: 'main' | 'border' | 'text') => {
const navList = ref<NavItem[]>([ const navList = ref<NavItem[]>([
{ {
title: '变量提升与作用域', title: '变量提升与作用域',
path: '/js/scope-hoisting', path: '/demo/jsHoistingScope',
desc: '执行上下文、词法作用域与 var/let/const 的底层差异。', desc: '执行上下文、词法作用域与 var/let/const 的底层差异。',
}, },
{ {

Loading…
Cancel
Save