当前位置: 首页 > news >正文

JavaScript核心概念全解析

目录

1. 作用域

(1) 局部作用域

(2) 全局作用域

2. 垃圾回收

(1) 引用计数法

(2) 标记清除法

3. 闭包

(1) 作用

(2) 风险

4. 变量提升

(1) var

(2) let 和 const

(3) const

5. 函数提升

(1) 函数声明

(2) 函数表达式

6. 函数参数

(1) 动态参数

(2) 剩余参数

(3) 展开运算符

7. 必须加分号的两种情况

(1) 立即执行函数

(2) 使用数组的时候

8. 箭头函数

(1) 特点

9. Symbol

10. 生成器函数

11. Promise

12. async 和 await

(1) async

(2) await


1. 作用域

作用域是指变量和函数的可访问范围。

(1) 局部作用域
  • 函数作用域:在函数内部声明的变量,外部无法访问。

    javascript

    function foo() {var x = 10; // 函数作用域
    }
    console.log(x); // 报错:x未定义
  • 块作用域:在大括号 {} 内部声明的变量。
    • var 声明的变量不会产生块作用域。
    • let 和 const 声明的变量会产生块作用域。

    javascript

    if (true) {let y = 20; // 块作用域
    }
    console.log(y); // 报错:y未定义
(2) 全局作用域
  • 最外层声明的变量,在任何地方都可以访问。

    javascript

    var z = 30; // 全局作用域
    function bar() {console.log(z); // 30
    }

2. 垃圾回收

垃圾回收是指自动管理内存的机制,释放不再使用的内存。

(1) 引用计数法
  • 已弃用。
  • 通过记录对象被引用的次数来判断是否回收。
  • 缺点:无法处理循环引用(两个对象相互引用),导致内存泄漏。
(2) 标记清除法
  • 从全局对象(根部)开始扫描,标记所有可达的对象。
  • 未标记的对象会被回收。
  • 解决了循环引用的问题。

3. 闭包

闭包是指一个函数及其对周围状态的引用捆绑在一起。

(1) 作用
  • 外部访问函数内部变量,实现数据私有。

    javascript

    function outer() {let count = 0;return function inner() {count++;return count;};
    }
    const fn = outer();
    console.log(fn()); // 1
    console.log(fn()); // 2
(2) 风险
  • 闭包会导致内存泄漏,因为内部函数会保留对外部函数变量的引用。

4. 变量提升

变量提升是指将变量声明提升到当前作用域的最前面。

(1) var
  • 函数作用域。
  • 变量提升。
  • 可以重复声明。

    javascript

    console.log(a); // undefined
    var a = 10;
(2) let 和 const
  • 块级作用域。
  • 没有变量提升。
  • 作用域内只能声明一次。

    javascript

    console.log(b); // 报错:b未定义
    let b = 20;
(3) const
  • 块级作用域。
  • 必须赋初始值。
  • 不能重新赋值,但可以修改数组或对象的元素。

    javascript

    const arr = [1, 2, 3];
    arr.push(4); // 允许
    arr = []; // 报错

5. 函数提升

函数声明会被提升到当前作用域的最前面。

(1) 函数声明
  • 提升函数声明,但不提升调用。

    javascript

    foo(); // "Hello"
    function foo() {console.log("Hello");
    }
(2) 函数表达式
  • 必须先声明赋值才能调用。

    javascript

    bar(); // 报错:bar未定义
    var bar = function() {console.log("World");
    };

6. 函数参数

(1) 动态参数
  • 使用 arguments 对象(伪数组)。

    javascript

    function sum() {let total = 0;for (let i = 0; i < arguments.length; i++) {total += arguments[i];}return total;
    }
    console.log(sum(1, 2, 3)); // 6
(2) 剩余参数
  • 使用 ... 获取多余实参(真数组)。

    javascript

    function sum(...nums) {return nums.reduce((a, b) => a + b);
    }
    console.log(sum(1, 2, 3)); // 6
(3) 展开运算符
  • 展开数组,不会修改原数组。

    javascript

    const arr1 = [1, 2];
    const arr2 = [3, 4];
    const merged = [...arr1, ...arr2]; // [1, 2, 3, 4]

7. 必须加分号的两种情况

(1) 立即执行函数

javascript

(function() {console.log("IIFE");
})();
(2) 使用数组的时候

javascript

const arr = [1, 2, 3];
[].push.apply(arr, [4, 5]);

8. 箭头函数

(1) 特点
  • this 是静态的,指向声明时的作用域。
  • 不能作为构造函数实例化对象。
  • 不能使用 arguments 对象。

    javascript

    const add = (a, b) => a + b;
    console.log(add(1, 2)); // 3

9. Symbol

  • 类似字符串的第七种基本数据类型。
  • 值是唯一的。
  • 不能与其他数据进行运算。
  • 不能遍历。

    javascript

    const id = Symbol("id");
    const obj = {[id]: 123
    };
    console.log(obj[id]); // 123

10. 生成器函数

  • 用于异步编程。

    javascript

    function* generator() {yield 1;yield 2;
    }
    const gen = generator();
    console.log(gen.next().value); // 1

11. Promise

  • 封装异步操作并获取成功或失败的结果。

    javascript

    const promise = new Promise((resolve, reject) => {setTimeout(() => resolve("Success"), 1000);
    });
    promise.then((result) => console.log(result)); // "Success"

12. async 和 await

(1) async
  • 返回一个 Promise 对象。

    javascript

    async function foo() {return "Hello";
    }
    foo().then((result) => console.log(result)); // "Hello"
(2) await
  • 必须写在 async 函数中。
  • 等待 Promise 完成并返回结果。

    javascript

    async function bar() {const result = await Promise.resolve("World");console.log(result); // "World"
    }
    bar();

http://www.xdnf.cn/news/1201213.html

相关文章:

  • 创建属于自己的github Page主页
  • 【Python系列】Flask 应用中的主动垃圾回收
  • 安装redis
  • 生成式召回-TIGER范式
  • Vim 编辑器工作模式及操作指南
  • 抗辐照芯片在低轨卫星星座CAN总线通讯及供电系统的应用探讨
  • 比特币运行机制全解析:区块链、共识算法与数字黄金的未来挑战
  • rapidocr v3.3.0发布了
  • OpenLayers 综合案例-轨迹回放
  • Torchv Unstrustured 文档解析库
  • C语言:函数
  • C/C++核心知识点详解
  • Qt C++ GUI 函数参数速查手册:基础与布局
  • RK3568 Linux驱动学习——Linux驱动开发准备工作
  • 【科研绘图系列】R语言绘制边际云雨图散点图
  • 基于大模型的预训练、量化、微调等完整流程解析
  • rust-模块树中引用项的路径
  • 1439-素数环2
  • 扩展组件(uni-ui)之uni-group
  • 硅基计划3.0 学习总结 肆 二叉树 初版
  • 疯狂星期四文案网第21天运营日记
  • 剑指offer第2版:双指针+排序+分治+滑动窗口
  • QT6 源,七章对话框与多窗体(17)用于辅助多文档 MDI 窗体设计 QMdiArea 的类 QMdiSubWindow:
  • MySQL 8.4 Windows 版安装记录与步骤参考
  • 《频率之光:群星之我》
  • mmap的调用层级与内核态陷入全过程
  • 依赖倒置原则 Dependency Inversion Principle - DIP
  • 不坑盒子突然不见了怎么办?
  • VILA系列论文解读
  • 详细解释一个ros的CMakeLists.txt文件