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.mfbz.cn/a/2668.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Red靶机攻略

一.环境准备 1.1Red靶机环境准备 1.1.1首先将我们解压好的的jangow-01-1.0.1.ova放入虚拟机里&#xff0c;并配置环境。安装好靶机后打开进行配置&#xff0c;按住shift&#xff0c;在界面按e进去得到图二。 1.1.2按住ctrlx&#xff0c;ip a查看网卡信息,修改网络配置文件 /e…

Linux之shell脚本篇(三)

一、 for循环使用基础语法for var in 数据域&#xff08;表达式&#xff09; do 语句1 done 代码案例1.循环3次hello world &#xff0c;打印循环池内容#!/bin/bash for i in www.jd.com www.qq.com www.4399.com do echo $i hello world.done 2.ping 网段范围内地址(1)打印网段…

9-大语言模型—Transformer 核心:多头注意力的 10 步拆解与可视化理解

目录 1、Transformer编码器堆叠的每层结构 2、输入嵌入 3、位置编码 4、多头注意力层 4.1、步骤1&#xff1a;表示输入 4.1.1、输入 4.1.2、示意图 ​编辑 4.2、步骤2&#xff1a;初始化权重矩阵 4.2.1、初始化Query权重矩阵&#xff1a; 4.2.2、初始化Key权重矩阵…

Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现标签条码一维码的检测(C#代码,UI界面版)

Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现标签条码一维码的检测&#xff08;C#代码&#xff0c;UI界面版&#xff09;&#xff09;工业相机使用YoloV8模型实现标签条码一维码的检测工业相机通过YoloV8模型实现标签条码的检测的技术背景在相机SDK中获取图像转换…

Python编程:初入Python魔法世界

一、常量表达式在编程中&#xff0c;常量指的是在程序执行期间其值不会改变的数据项。虽然 Python 并没有专门的语法来定义常量&#xff08;不像某些其他语言如 Java 中有 final 关键字&#xff09;&#xff0c;但在实践中&#xff0c;我们通常通过约定俗成的方式来表示一个变量…

使用Python实现单词记忆软件

前言该代码实现了一个基于PyQt5的单词记忆软件&#xff0c;支持高考、四级、六级和考研四个级别的词库。程序提供四种学习模式&#xff1a;拆分模式&#xff08;将单词拆分为片段重组&#xff09;、填空模式&#xff08;选择正确字母填空&#xff09;、输入模式&#xff08;手动…

C++查询mysql数据

文章目录 文章目录 1.前言 2. 代码 &#xff08;1&#xff09;执行查询SQL &#xff08;2&#xff09;获取结果集 &#xff08;3&#xff09;遍历结果集&#xff08;获取字段数、行数&#xff09; &#xff08;4&#xff09;释放资源 3.完整代码 1.前言 我们成功连接数…

机器学习特征工程:特征选择及在医学影像领域的应用

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#,Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开发…

【GoLang#3】:数据结构(切片 | map 映射)

一、切片 之前我们在数组那举过一个例子&#xff1a;关于 值类型 和 引用类型的&#xff0c;如下&#xff1a; func main(){// 值类型: 数组var a1 [...]int{1, 2, 3}a2 : a1a1[0] 11fmt.Println(a1) // 11 2 3fmt.Println(a2) // 1 2 3// 引用类型: 切片var b1 []int{1, 2,…

Spring的深入浅出(6)--使用AOP的思想改造转账案例

在Spring中使用AOP&#xff08;基于注解&#xff09;使用AOP的思想改造转账案例业务类改造&#xff1a;移除事务管理代码public class AccountServiceImpl implements AccountService {private AccountDao accountDao;public void setAccountDao(AccountDao accountDao) {this.…

【LeetCode刷题指南】--有效的括号

&#x1f525;个人主页&#xff1a;草莓熊Lotso &#x1f3ac;作者简介&#xff1a;C研发方向学习者 &#x1f4d6;个人专栏&#xff1a; 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言&#xff1a;生活是默默的坚持&#xff0c;毅力是永久的…

【PyTorch】图像多分类项目

【PyTorch】图像二分类项目 【PyTorch】图像二分类项目-部署 【PyTorch】图像多分类项目 【PyTorch】图像多分类项目部署 多类图像分类的目标是为一组固定类别中的图像分配标签。 目录 加载和处理数据 搭建模型 定义损失函数 定义优化器 训练和迁移学习 用随机权重进行训…