JavaScript 作用域全面总结
JavaScript 作用域全面总结
作用域(Scope)是JavaScript中一个核心概念,决定了变量、函数和对象的可访问性。以下是JavaScript作用域的全面总结,结合表格和箭头图进行讲解。
一、作用域类型
JavaScript 作用域类型详解
JavaScript 中有四种主要的作用域类型,每种都有不同的特性和使用场景。下面我将结合具体代码示例详细讲解每种作用域。
1. 全局作用域(Global Scope)
定义:在所有函数和代码块之外声明的变量
特点:
• 在任何地方都可以访问
• 生命周期与应用程序相同
• 使用 var
声明的全局变量会成为 window
对象的属性
// 全局作用域示例
var globalVar = '我是全局变量';
let globalLet = '我也是全局变量,但不会挂到window上';
const globalConst = '我是全局常量';function checkGlobal() {console.log(globalVar); // "我是全局变量"console.log(globalLet); // "我也是全局变量,但不会挂到window上"console.log(window.globalVar); // "我是全局变量" (var特有)console.log(window.globalLet); // undefined (let不会挂载)
}checkGlobal();
2. 函数作用域(Function Scope)
定义:在函数内部声明的变量
特点:
• 只能在函数内部访问
• var
声明的变量具有函数作用域
• 函数参数也属于函数作用域
function functionScopeDemo() {var funcVar = '函数内的var变量';let funcLet = '函数内的let变量';if (true) {var innerVar = 'if块内的var变量'; // 实际上属于函数作用域let innerLet = 'if块内的let变量'; // 属于块级作用域}console.log(funcVar); // "函数内的var变量"console.log(funcLet); // "函数内的let变量"console.log(innerVar); // "if块内的var变量" (可访问)console.log(innerLet); // ReferenceError: innerLet is not defined
}functionScopeDemo();
console.log(funcVar); // ReferenceError: funcVar is not defined
3. 块级作用域(Block Scope)
定义:由 {}
包围的代码块内部的作用域
特点:
• let
和 const
声明的变量具有块级作用域
• 适用于 if
、for
、while
、switch
等代码块
• var
声明的变量不受块级作用域限制
// 块级作用域示例
if (true) {var blockVar = '块内的var变量'; // 实际上会提升到函数或全局作用域let blockLet = '块内的let变量'; // 真正的块级作用域const blockConst = '块内的const常量';console.log(blockVar); // "块内的var变量"console.log(blockLet); // "块内的let变量"console.log(blockConst); // "块内的const常量"
}console.log(blockVar); // "块内的var变量" (可访问)
console.log(blockLet); // ReferenceError: blockLet is not defined
console.log(blockConst); // ReferenceError: blockConst is not defined// for循环中的块级作用域
for (let i = 0; i < 3; i++) {setTimeout(() => console.log(i), 100); // 输出 0, 1, 2 (每个i有独立作用域)
}for (var j = 0; j < 3; j++) {setTimeout(() => console.log(j), 100); // 输出 3, 3, 3 (共享同一个j)
}
4. 模块作用域(Module Scope)
定义:ES6 模块中声明的变量
特点:
• 每个模块文件都有自己的作用域
• 需要使用 export
导出才能被其他模块访问
• 使用 import
导入其他模块的变量
// moduleA.js
const privateVar = '我是模块私有变量'; // 模块作用域,外部无法访问
export const publicVar = '我是模块导出变量'; // 可以被其他模块导入// moduleB.js
import { publicVar } from './moduleA.js';console.log(publicVar); // "我是模块导出变量"
console.log(privateVar); // ReferenceError: privateVar is not defined
5. 作用域的特殊情况
闭包作用域(Closure Scope)
function createCounter() {let count = 0; // 闭包作用域return {increment: function() {count++;return count;},current: function() {return count;}};
}const counter = createCounter();
console.log(counter.current()); // 0
console.log(counter.increment()); // 1
console.log(counter.increment()); // 2
// count变量被闭包保护,外部无法直接访问
立即执行函数表达式(IIFE)的作用域
(function() {var iifeVar = 'IIFE内的变量';console.log(iifeVar); // "IIFE内的变量"
})();console.log(iifeVar); // ReferenceError: iifeVar is not defined
动态作用域(this 的绑定)
const obj = {value: 42,getValue: function() {return this.value; // this的绑定在调用时确定}
};console.log(obj.getValue()); // 42 (this指向obj)const unboundGet = obj.getValue;
console.log(unboundGet()); // undefined (this指向全局或undefined)
总结表格
作用域类型 | 声明方式 | 可访问范围 | 变量提升 | 重复声明 | 成为window属性 |
---|---|---|---|---|---|
全局作用域 | var/let/const | 全局 | var: 是, let/const: 否 | var: 可, let/const: 不可 | var: 是, let/const: 否 |
函数作用域 | var | 函数内部 | 是 | 可 | 否 |
块级作用域 | let/const | 代码块内部 | 否 | 不可 | 否 |
模块作用域 | const/let | 模块内部 | 否 | 不可 | 否 |
理解这些作用域类型和它们的特性,可以帮助你编写更清晰、更少bug的JavaScript代码。
作用域类型对比表
作用域类型 | 定义位置 | 可访问性 | 特点 | 示例 |
---|---|---|---|---|
全局作用域 | 所有函数和代码块之外 | 任何地方都可访问 | 生命周期与应用程序相同 | var globalVar = 'global'; |
函数作用域 | 函数内部 | 仅在函数内部可访问 | var 声明的变量具有函数作用域 | function foo() { var local = 'local'; } |
块级作用域 | {} 代码块内部 | 仅在代码块内部可访问 | let 和const 声明的变量具有块级作用域 | if(true) { let blockVar = 'block'; } |
模块作用域 | ES6模块文件内部 | 仅在模块内部可访问 | 每个模块有自己的作用域 | export const moduleVar = 'module'; |
二、JavaScript 中拥有作用域的元素详解
JavaScript 中的作用域机制决定了变量和函数的可访问性。下面我将详细讲解 JavaScript 中所有拥有作用域的元素及其具体行为。
1. 变量声明方式的作用域
1.1 var
声明
- 作用域类型:函数作用域
- 特点:
- 在函数内部声明则为局部变量
- 在函数外部声明则为全局变量
- 存在变量提升(hoisting)
- 可重复声明
function varExample() {if (true) {var x = 10; // 整个函数内都可用}console.log(x); // 输出 10
}
1.2 let
声明
- 作用域类型:块级作用域
- 特点:
- 只在声明所在的代码块内有效
- 不存在变量提升
- 不可重复声明
- 暂时性死区(TDZ)
function letExample() {if (true) {let y = 20;console.log(y); // 输出 20}console.log(y); // 报错: y is not defined
}
1.3 const
声明
- 作用域类型:块级作用域
- 特点:
- 必须初始化
- 不能重新赋值
- 其他特性同
let
- 对于对象/数组,内容可修改但引用不可变
const PI = 3.1415;
// PI = 3.14; // 报错const arr = [1, 2];
arr.push(3); // 允许
// arr = [4,5]; // 报错
2. 函数的作用域
2.1 函数声明
- 作用域规则:
- 函数名绑定在所在作用域
- 函数体内部形成新的作用域
- 存在函数提升
function outer() {inner(); // 可以调用,因为函数提升function inner() {console.log("Inner function");}
}
2.2 函数表达式
- 作用域规则:
- 变量部分遵循变量声明规则
- 函数体内部仍是独立作用域
const myFunc = function() {// 函数体作用域console.log("Function expression");
};
2.3 箭头函数
- 特殊作用域特性:
- 没有自己的
this
、arguments
、super
或new.target
- 继承父级作用域的
this
- 更简洁的词法作用域绑定
- 没有自己的
const obj = {value: 42,getValue: function() {setTimeout(() => {console.log(this.value); // 正确获取42,因为继承父作用域this}, 100);}
};
3. 代码块结构的作用域
3.1 if
/else
语句
if (true) {let blockScoped = "visible";var functionScoped = "visible";
}
console.log(functionScoped); // "visible"
console.log(blockScoped); // 报错
3.2 循环语句
for (let i = 0; i < 3; i++) {// i只在循环体内有效
}
console.log(i); // 报错for (var j = 0; j < 3; j++) {// j在整个函数内有效
}
console.log(j); // 3
3.3 switch
语句
switch (x) {case 1:let result = "one";break;case 2:// result = "two"; // 报错,因为result已在同一作用域声明break;
}
3.4 空代码块
{let privateVar = "secret";const secretKey = "12345";
}
// privateVar 和 secretKey 在这里不可访问
4. 模块系统的作用域
4.1 ES6 模块
// module.js
const privateData = "hidden";
export const publicData = "visible";// app.js
import { publicData } from './module.js';
console.log(publicData); // "visible"
console.log(privateData); // 报错
4.2 CommonJS 模块(Node.js)
// module.js
const localVar = "local";
module.exports = { publicVar: "public" };// app.js
const { publicVar } = require('./module');
console.log(publicVar); // "public"
console.log(localVar); // 报错
5. 类(Class)的作用域
5.1 类声明
class MyClass {constructor() {this.instanceVar = "instance";}method() {let localVar = "local";}
}console.log(MyClass); // 类可用
// console.log(localVar); // 报错
5.2 类表达式
const MyClass = class {// 类体作用域
};{class PrivateClass {} // 只在块内可用
}
6. 特殊结构的作用域
6.1 立即执行函数表达式(IIFE)
(function() {var private = "secret";
})();
console.log(private); // 报错
6.2 with
语句(已废弃)
const obj = { a: 1 };
with (obj) {console.log(a); // 1// 创建了一个临时作用域链
}
6.3 try/catch
语句
try {throw new Error("test");
} catch (err) { // err只在catch块内有效console.log(err.message);
}
console.log(err); // 报错
三、大白话讲清楚JavaScript作用域优先级
在了解作用域的优先级之前,我们首先要知道作用域的链式结构:
全局作用域 (window/global)
│
├── 函数A作用域
│ │
│ ├── 函数B作用域
│ │ │
│ │ └── 块级作用域 (if/for等)
│ │
│ └── 块级作用域
│
├── 函数C作用域
│
└── 块级作用域
1. 就近原则 - “先看手边,再找远处”
想象你在一个多层楼的办公楼里找打印机:
- 你会先看自己工位旁边有没有(当前作用域)
- 没有的话去部门公共区找(上一层作用域)
- 还找不到就去公司总打印室(全局作用域)
let printer = "总打印室"; // 全局function department() {let printer = "部门打印机"; // 部门级function employee() {let printer = "工位打印机"; // 个人console.log(printer); // 先用"工位打印机"}employee();
}
2. 先来后到 - “先声明者优先”
就像排队买奶茶:
- 先来的顾客先点单(先声明的变量先被使用)
- 后面的同名声明会被忽略(
var
允许重复声明) - 但插队是不允许的(
let/const
不允许重复声明)
var drink = "奶茶"; // 第一个顾客
var drink = "咖啡"; // 第二个顾客,替换了前面的
console.log(drink); // 最后买到的是"咖啡"let food = "汉堡";
// let food = "薯条"; // 报错:不能插队重复声明
3. 内外有别 - “里面可以看外面,外面看不到里面”
就像公司保密制度:
- 普通员工(内层)可以看到公司公告(外层变量)
- 但公司(外层)看不到员工的私人笔记(内层变量)
- 部门之间也互相隔离(不同函数作用域互不可见)
let companySecret = "今年盈利"; // 公司级function departmentA() {let teamNote = "项目进度"; // 部门A私有console.log(companySecret); // 可以看公司信息
}// console.log(teamNote); // 报错:外部不能访问部门内部信息
4. 块级隔离 - “会议室谈话不外传”
就像公司会议室:
- 在会议室(
{}
代码块)里讨论的事情(let/const
变量) - 出了会议室就自动销毁(不可访问)
- 但用大喇叭(
var
)宣布的全公司都能听见
{let meetingTopic = "裁员计划"; // 只在会议室有效var announcement = "明年上市"; // 全公司都能听到
}// console.log(meetingTopic); // 报错:会议内容不公开
console.log(announcement); // 可以听到
5. 闭包特例 - “离职员工带走公司机密”
就像员工离职后:
- 正常应该交还门禁卡(销毁作用域)
- 但如果他记下了密码(形成闭包)
- 之后还能远程访问公司资料(外部访问内部变量)
function createEmployee() {let salary = 10000; // 公司内部数据return {getSalary: () => salary // 离职员工带走了访问权限};
}const exStaff = createEmployee();
console.log(exStaff.getSalary()); // 还能查到工资!
6. 模块隔离 - “分公司独立运营”
就像集团子公司:
- 每个子公司(模块)有自己的资金(变量)
- 要公开的部分得特别声明(
export
) - 其他公司想用必须申请导入(
import
)
// 子公司A.js
let budget = 100万; // 自己知道
export let project = "新项目"; // 对外公开// 集团公司.js
import { project } from '子公司A';
console.log(project); // 能看见公开项目
// console.log(budget); // 报错:看不到别家内部预算
记住这些生活化的比喻,下次遇到作用域问题就想想:
- 这个变量是"部门公告"还是"私人笔记"?
- 这个函数是"在职员工"还是"离职员工"?
- 这段代码在"工位"、"部门"还是"总公司"层级?
四、作用域最佳实践
作用域的良好使用是编写高质量JavaScript代码的关键。下面我将通过具体示例详细讲解作用域的最佳实践。
1. 变量声明方式选择
优先使用 const
// 好 👍
const MAX_SIZE = 100; // 不可变的值使用const
const user = { name: '张三' }; // 引用类型也可以用const
user.name = '李四'; // 可以修改对象属性// 差 👎
var MAX_SIZE = 100; // var没有块级作用域
let user = { name: '张三' }; // 如果引用不会改变,不需要用let
需要重新赋值时使用 let
// 好 👍
let count = 0;
count = 1; // 需要重新赋值时使用let// 差 👎
var count = 0; // var容易造成变量提升问题
避免使用 var
// 问题示例 ❌
function problematic() {if (true) {var temp = '临时值'; // var会提升到函数作用域}console.log(temp); // 可以访问,不符合预期
}// 修复方案 ✅
function fixed() {if (true) {let temp = '临时值'; // 限制在块级作用域}console.log(temp); // ReferenceError: 符合预期
}
2. 缩小变量作用域范围
将变量声明在最小必要作用域内
// 好 👍
function processData(data) {if (data) {const result = transform(data); // 只在需要的地方声明console.log(result);}// result在这里不可访问
}// 差 👎
function processData(data) {let result; // 过早声明if (data) {result = transform(data);console.log(result);}// result在这里仍然可访问
}
循环中的变量作用域
// 好 👍
for (let i = 0; i < 10; i++) { // 每次迭代都有独立的isetTimeout(() => console.log(i), 100); // 输出0-9
}// 差 👎
for (var i = 0; i < 10; i++) { // 共享同一个isetTimeout(() => console.log(i), 100); // 输出10个10
}
3. 避免全局污染
使用IIFE隔离作用域
// 好 👍
(function() {const privateVar = '私有变量';window.myLib = { // 有选择地暴露到全局publicMethod: function() {return privateVar;}};
})();// 差 👎
var globalVar = '污染全局'; // 直接污染全局命名空间
使用模块系统
// utils.js
const privateHelper = () => '私有方法';
export const publicUtil = () => privateHelper();// app.js
import { publicUtil } from './utils.js';
console.log(publicUtil()); // 使用模块化的公共方法
4. 闭包的合理使用
有控制地使用闭包
// 好 👍
function createCounter() {let count = 0; // 闭包保护的变量return {increment: () => ++count,get: () => count,reset: () => { count = 0; }};
}const counter = createCounter();
counter.increment();
console.log(counter.get()); // 1// 差 👎
let count = 0; // 直接暴露在全局
function increment() {return ++count;
}
// 任何人都可以修改count
避免意外的闭包
// 问题示例 ❌
function setupElements() {const elements = document.querySelectorAll('.btn');for (var i = 0; i < elements.length; i++) {elements[i].onclick = function() {console.log(i); // 总是输出elements.length};}
}// 修复方案 ✅
function setupElementsFixed() {const elements = document.querySelectorAll('.btn');for (let i = 0; i < elements.length; i++) { // 使用letelements[i].onclick = function() {console.log(i); // 正确输出索引};}
}
4. 函数声明的位置
避免在块内声明函数
// 问题示例 ❌
if (true) {function foo() { console.log('1'); }
} else {function foo() { console.log('2'); }
}
foo(); // 不同浏览器行为不一致// 修复方案 ✅
let foo;
if (true) {foo = () => console.log('1');
} else {foo = () => console.log('2');
}
foo(); // 行为一致
使用函数表达式
// 好 👍
const handler = function() { /* 处理逻辑 */ };// 差 👎
function handler() { /* 处理逻辑 */ }
// 会被提升,可能影响代码可读性
6. 命名冲突避免
使用有意义的命名
// 好 👍
function calculateOrderTotal(order) {const taxRate = 0.1;return order.subtotal * (1 + taxRate);
}// 差 👎
function calc(a) {const b = 0.1; // 无意义的命名return a * (1 + b);
}
使用命名空间
// 好 👍
const MyApp = {};
MyApp.Utils = {formatDate: function(date) { /* ... */ },validateEmail: function(email) { /* ... */ }
};// 差 👎
function formatDate(date) { /* ... */ } // 直接放在全局
function validateEmail(email) { /* ... */ }
7. 严格模式的使用
// 好 👍
'use strict';
function strictFunc() {undeclaredVar = 'test'; // 会抛出ReferenceError
}// 差 👎
function sloppyFunc() {undeclaredVar = 'test'; // 自动创建全局变量
}
总结表格
最佳实践 | 推荐做法 | 不推荐做法 | 原因 |
---|---|---|---|
变量声明 | const > let > var | 随意使用var | 避免变量提升和污染 |
作用域范围 | 最小必要作用域 | 过早声明或全局声明 | 减少意外访问 |
全局变量 | IIFE/模块暴露 | 直接声明全局变量 | 避免命名冲突 |
闭包使用 | 有控制地使用 | 滥用或意外创建 | 内存管理 |
函数声明 | 函数表达式 | 块内函数声明 | 行为一致性 |
命名冲突 | 命名空间/模块 | 简短无意义命名 | 代码可维护性 |
严格模式 | 始终使用 | 不使用 | 避免隐式错误 |
通过遵循这些最佳实践,你可以:
- 减少变量污染和命名冲突
- 提高代码的可预测性和可维护性
- 避免常见的作用域陷阱
- 编写更安全、更高效的JavaScript代码
通过理解这些作用域规则,您可以更好地组织代码结构,避免变量污染和命名冲突,编写出更健壮、可维护的JavaScript代码。
相关文章:
JavaScript 作用域全面总结
JavaScript 作用域全面总结 作用域(Scope)是JavaScript中一个核心概念,决定了变量、函数和对象的可访问性。以下是JavaScript作用域的全面总结,结合表格和箭头图进行讲解。 一、作用域类型 JavaScript 作用域类型详解 JavaScript 中有四种主要的作用…...
Redis核心与底层实现场景题深度解析
Redis核心与底层实现场景题深度解析 在互联网大厂Java求职者的面试中,经常会被问到关于Redis的核心与底层实现相关的场景题。本文通过一个故事场景来展示这些问题的实际解决方案。 第一轮提问 面试官:马架构,欢迎来到我们公司的面试现场。…...
代发考试战报:4月份 思科认证,华为认证,考试战报分享
CCNP 300-410考试通过战报,350-401 考试通过战报,CCNA 200-301 考试通过战报,HCIP数通 H12-821考试通过,H12-831考试通过,HCSP 行业金融 H19-611考试通过,HCSE 行业金融 H21-293 考试通过 报名考试一定要找…...
Linux 内核中 TCP 协议的支撑解析
在 Linux 网络协议栈中,TCP(传输控制协议)作为面向连接的可靠传输协议,其实现依赖于一系列复杂的内核机制。本文通过分析四个关键函数(cookie_v4_init_sequence、tcp_fastopen_ctx_destroy、sk_forced_mem_schedule 和 sk_stream_alloc_skb),探讨它们如何共同保障 TCP 的…...
std::string的底层实现 (详解)
目录 std::string的底层实现* 写时复制原理探究 CowString代码初步实现 短字符串优化(SSO) 最佳策略 std::string的底层实现* 我们都知道, std::string的一些基本功能和用法了,但它底层到底是如何实现的呢? 其实在std::stri…...
蓝桥杯 11. 最大距离
最大距离 原题目链接 题目描述 在数列 a1, a2, ⋯, an 中,定义两个元素 ai 和 aj 的距离为: |i - j| |ai - aj|即元素下标的距离加上元素值的差的绝对值,其中 |x| 表示 x 的绝对值。 给定一个数列,请找出元素之间最大的元素…...
【运维】使用 DataX 实现 MySQL 到 PostgreSQL 的数据同步
🚀 使用 DataX 实现 MySQL 到 PostgreSQL 的数据同步 在日常的数据开发工作中,数据同步是一项极其常见的任务。而 DataX 作为阿里开源的一款通用数据同步工具,支持多种数据源之间的互通,使用简单,扩展性强,非常适合进行结构化数据的迁移和同步。 本文将详细介绍如何通…...
Mangodb基本概念和介绍,Mango三个重要的概念:数据库,集合,文档
MongoDB基本概念和介绍 MongoDB 是一个开源的、基于分布式文件存储的NoSQL数据库,由 C 编写。 它的主要特点是: 使用**面向文档(Document-Oriented)**的存储方式,不是传统的表格行列模式。存储的数据格式是BSON&…...
什么是ICSP编程
ICSP编程介绍 ICSP 编程(In-Circuit Serial Programming),即“在线串行编程”,是一种通过 SPI 协议 直接对微控制器(如 Arduino 的 ATmega328P)进行编程的技术,无需移除芯片。它常用于以下场景…...
LeetCode 155题解 | 最小栈
最小栈 一、题目链接二、题目三、算法原理思路1:用一个变量存储最小元素思路2:双栈普通栈和最小栈 四、编写代码五、时间复杂度 一、题目链接 最小栈 二、题目 三、算法原理 栈用数组、链表实现都行,最主要的就是在能在常数时间内检索到最…...
Modal 深度解析:无服务器高性能计算平台实战指南
概览 Modal 是一个 “零配置,无需 YAML” 的云函数平台,通过将你的 Python 代码打包进容器并在 Modal 自建的云环境中执行,实现秒级启动、按秒计费、自动弹性扩缩容等能力。它构建在高性能 Rust 容器堆栈与 gVisor 沙箱之上,为大规模 AI 推理、批量数据处理、作业调度、Web…...
数字逻辑--期末大复习
写卷子前准备:二进制串、卡诺图的数序、分析与设计的步骤,直接写上省的忘了 进制转化 二进制 刚开始做题前可以把0-9次方的列出来 十进制转二进制:不断除以2得到余数,直到商为0,再将余数倒着拼起来即可。 如十六进制ÿ…...
【Redis】缓存|缓存的更新策略|内存淘汰策略|缓存预热、缓存穿透、缓存雪崩和缓存击穿
思维导图: Redis最主要的用途,三个方面: 1.存储数据(内存数据库) 2.缓存(redis最常用的场景) 3.消息队列 一、什么是缓存 我们知道对于硬件的访问速度来说,通常情况下࿱…...
kubelet 清理资源以缓解磁盘压力
kubelet 资源清理缓解磁盘压力指南 在 Kubernetes 集群中,当节点磁盘压力过大时,可通过以下几种方式利用 kubelet 清理资源,从而缓解磁盘压力。 一、镜像垃圾回收 自动回收 kubelet 内置了镜像垃圾回收机制,其行为由配置参数控…...
机器人“跨协议对话”秘籍:EtherNet IP转PROFINET网关应用实录
近期,我们工厂在进行自动化生产线升级改造时,引进了一批全新的机器人手臂设备。这批机器人采用EtherNet/IP通信协议,而生产线上原有的终端控制器则使用PROFINET协议。由于两种协议在通信标准和数据格式上存在差异,导致机器人手臂无…...
松下机器人快速入门指南(2025年更新版)
松下机器人快速入门指南(2025年更新版) 松下机器人以其高精度、稳定性和易用性在工业自动化领域广泛应用。本文将从硬件配置、参数设置、手动操作、编程基础到维护保养,全面讲解松下机器人的快速入门方法,帮助新手快速掌握核心操…...
开启健康养生,重塑生活品质
当你习惯性地用咖啡开启忙碌的一天,当熬夜加班成为生活常态,当外卖占据一日三餐,或许未曾察觉,健康正悄然亮起红灯。在快节奏的现代生活中,健康养生不再是可选项,而是关乎生活质量与生命活力的必答题&#…...
百度「心响」:通用超级智能体,重新定义AI任务执行新范式
在AI技术从“对话交互”迈向“任务执行”的转折点,百度于2025年4月正式推出移动端超级智能体应用——心响。这款以“AI任务完成引擎”为核心的创新产品,被誉为“AI指挥官”,通过自然语言交互实现复杂任务的全流程托管,覆盖知识解析…...
AXPA17388: 4x45W 车用AB类四通道桥式输出音频功率放大器
AXPA17388是采用BCD(双极型,CMOS,DMOS)工艺技术设计的四通道桥式输出AB类车用音频功率放大器,采用完全互补的P型/ N型输出结构, 具有轨到轨的输出电压摆幅,高输出电流,具有出色的低失真性能。 AXPA17388可以…...
【codeforces 2086d】背包+组合数学
【codeforces 2086d】背包组合数学 Problem - D - Codeforces 题意: 给出字符串中每个字符的出现次数 c i ( 1 ≤ i ≤ 26 ) c_i(1 \leq i \leq 26) ci(1≤i≤26)。现构造一个字符串,要求任意相同字母之间的距离必须是偶数。求满足要求的字符串的数量…...
[特殊字符]OCR,给交通领域开了“外挂”?
OCR 技术是什么 宝子们,OCR 其实就是光学字符识别(Optical Character Recognition)的英文缩写。简单来说,它能让电子设备,比如扫描仪、摄像头这些,像长了眼睛一样,“看” 懂图片或文档里的文字&…...
【语法】C++继承中遇到的问题及解决方法
目录 1.子类构造函数中初始化父类成员 2.子类显式调用父类的析构函数 第一种说法:重定义 反驳: 第二种说法:operator~ 3.因编译器版本过低而出现错误 贴主在学习C的继承时,遇到了很多问题,觉得很变态,…...
【自然语言处理与大模型】LangChain大模型应用框架入门②
本文介绍LangChain的另一个重要组件——提示词模板(Prompt Template)组件,它主要用于将用户输入和参数转换为语言模型可理解的指令。有助于引导模型生成符合预期的响应,帮助其更好地理解上下文,从而输出相关且连贯的语…...
首页数据展示
排版 现在做首页的排版,依旧是偷antd里面的东西 使用card包裹list的样式 import React from react import axios import { Card, Col, Row, List } from antd import { EditOutlined, EllipsisOutlined, SettingOutlined } from ant-design/icons; import { Avat…...
推荐系统实验指标置信度:p值核心原理与工程应用指南
目录 一、推荐系统实验中的置信度困境二、p值核心原理:从假设检验到推荐场景适配2.1 基础概念与数学定义2.2 通俗版本核心白话总结: 2.2 推荐系统指标分类与统计方法 三、推荐系统实验p值计算全流程3.1 实验设计阶段:流量分配与检验效能3.2 数…...
linux FTP服务器搭建
FTP服务器搭建 系统环境:ubuntu 搭建方式:win系统下通过ssh连接ubuntu,搭建FTP服务 一、ssh连接 ssh -p 端口 用户名IP ssh -p 22 ubuntu192.168.1.109 密码:ubuntu123456 二、安装配置FTP服务器 1、安装 sudo apt install v…...
如何搭建一个简单的文件服务器的方法
搭建一个简易的文件服务器可以让你在局域网或互联网中共享文件,方便不同设备之间的访问与管理。以下是基于常见平台(Windows、Linux)分别介绍如何搭建一个简单的文件服务器的方法,适合个人或小型办公环境使用。 一、文件服务器的准备工作 所需条件&#…...
通信原理第七版与第六版的区别附pdf
介绍 我用夸克网盘分享了「通信原理 第7版》樊昌信」, 链接:https://pan.quark.cn/s/be7c5af4cdce 《通信原理(第7版)》是在第6版的基础上,为了适应当前通信技术发展和教学需求,并吸取了数十所院校教师的反…...
【工具】PDF转HTML
【工具】PDF转HTML 可通过命令执行, 集成到项目中 pdf2htmlEX windows系统可执行版下载地址: http://soft.rubypdf.com/software/pdf2htmlex-windows-version https://github.com/coolwanglu/pdf2htmlEX .\pdf2htmlEX.exe --zoom 1.8 a.pdf .\pdf2html…...
Latex全面汇总
文章目录 简介1.基本使用中文编码的方式2.文章标题日期等3.加粗斜体等格式4.章节问题5.图片问题6.列表7.数学公式8.表格9.常用的latex网站汇总总结 简介 Latex 基本使用教程,主要还是为manim而准备的. 现在发现用typora来记录笔记更方便些,csdn用的就很少了&…...
AI日报 - 2025年04月30日
🌟 今日概览(60秒速览) ▎🤖 AGI突破 | 扎克伯格预言通用智能将超越个体,Neuralink助ALS患者思维交流 通用智能系统潜力巨大,脑机接口实现重大应用突破。 ▎💼 商业动向 | 阿里巴巴发布Qwen3,xAI推Grok 3 M…...
redis高级进阶
1.redis主从复制 redis主从复制1 2.redis哨兵模式 哔哩哔哩视频 redis哨兵模式1 redis哨兵模式2 redis哨兵模式3 3.redis分片集群 redis分片集群1 redis分片集群2 redis分片集群3...
【android bluetooth 协议分析 06】【l2cap详解 11】【l2cap连接超时处理逻辑介绍】
我们在使用蓝牙的过程中, 当上层 应用 断开所有的 profile 后, 协议栈就会帮我们下发 disconnect 命令。本节就让笨叔, 带大家一起梳理这块内容,具体在协议栈如何处理的。 梳理开始前, 先思考一下。 我们为什么要梳理…...
Spring、Spring MVC 与 Spring Boot 的关系与核心用途
1. 三者关系图解 ------------------- | Spring Boot | → 基于 Spring,简化配置与部署 -------------------▲| 依赖 ------------------- | Spring Framework | → 核心容器(IoC/AOP)与基础模块 -------------------▲| 扩展 ---…...
如何搭建spark yarn 模式的集群集群
(一)什么是SparkONYarn模式 Spark on YARN(Yet Another Resource Negotiator)是 Spark 框架在 Hadoop 集群中运行的一种部署模式,它借助 Hadoop YARN 来管理资源和调度任务。 架构组成 ResourceManager:作为…...
共探蓝海赛道增长新方法 阿里国际站智能AI全球买家分析峰会在深落幕
来源:深圳晚报 随着全球贸易环境不断变化,跨境电商已成为推动企业发展的重要动力。为帮助企业更好地应对新的市场挑战,阿里巴巴国际站深莞惠大区于4月29日举办了“万亿商机 蓝海新市场”智能AI全球买家分析峰会,现已圆满落幕&…...
今日行情明日机会——20250429
指数依然在区间震荡,等待方向,重点关注决定大盘方向的板块,如证券的走势~ 2025年4月29日涨停主要行业方向分析 一、核心主线方向 一季报增长(业绩驱动资金避险) • 涨停家数:16家。 • 代表标的ÿ…...
什么是缓存?在NGINX中如何配置缓存以提升性能?
大家好,我是锋哥。今天分享关于【什么是缓存?在NGINX中如何配置缓存以提升性能?】面试题。希望对大家有帮助; 什么是缓存?在NGINX中如何配置缓存以提升性能? 1000道 互联网大厂Java工程师 精选面试题-Java…...
价值投资笔记:企业护城河——虚假陷阱与隐性壁垒的深度解析
一、护城河的本质与误判风险 护城河是企业抵御竞争、维持超额利润的核心能力。然而,市场中充斥着大量“虚假护城河”,它们看似构成壁垒,实则脆弱易碎。晨星公司研究显示,超过60%的企业竞争优势被误判为护城河,投资者需…...
2025年04月29日Github流行趋势
项目名称:Deep-Live-Cam 项目地址url:https://github.com/hacksider/Deep-Live-Cam项目语言:Python历史star数:52291今日star数:380项目维护者:hacksider, KRSHH, vic4key, pereiraroland26, kier007项目简…...
docker排查OOM Killer
文章目录 一.检查1.内存不足 (OOM Killer)2. CPU 资源限制3. 存储空间不足4. 应用自身崩溃5. 健康检查失败针对性建议 二.内存不足问题根源解决方案(按优先级排序)1. 紧急措施:立即释放内存2. 启用 Swap 交换空间(必须做ÿ…...
leetcode继续c++10/100
不应该是10-13-3吗 ChatGLM 引用 从代码片段来看,函数 findAnagrams 的目的是在字符串 s 中找到所有与字符串 p 是字母异位词的子串的起始索引。 代码中有一些调试输出语句,这些语句可能会影响程序的正常逻辑。具体来说: cpp 复制 cout …...
Kubernetes集群使用Harbor容器镜像仓库
实验环境 一、容器镜像仓库Harbor部署 1、配置主机名 192.168.10.14: hostnamectl set-hostname harbor 2、安装Docker wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum -y install docker-…...
归并排序排序总结
1. 归并排序 1.1 基本思想 归并排序(Merge Sort)是采用分治法(Divide and Conquer)的一个非常典型的应用。它的基本思想是将一个数组分成两个子数组,分别对这两个子数组进行排序,然后将排好序的子数组合并…...
面试手撕——快速排序
思路 partition方法将整个区间分为两部分,一部分比pivot小,一部分比pivot大, i表示,小于等于pivot的下标,j表示当前遍历到哪一个元素了,如果发现当前元素j小于等于pivot,i,在i1的位…...
大模型微调之LLaMA-Factory 系列教程大纲
LLaMA-Factory 系列教程大纲 一、基础入门篇:环境搭建与核心功能解析 环境部署与框架特性 硬件要求: 单机训练:推荐 24GB 显存 GPU(如 RTX 4090),支持 7B-32B 模型 LoRA 微调。分布式训练:2 块…...
26考研 | 王道 | 计算机网络 | 第一章 计算机网络的体系结构
26考研 | 王道 | 第一章 计算机网络的体系结构 文章目录 26考研 | 王道 | 第一章 计算机网络的体系结构1.1 计算机网络概述1.计算机网络的概念2.计算机网络的组成**从组成部分看****从工作方式看****从逻辑功能看** 3.计算机网络的功能4.电路交换、报文交换、分组交换1. 电路交…...
CentosLinux系统crontab发现执行删除命令失效解决方法
权限或安全策略限制 可能场景: ### 目录权限冲突: 你的目录权限为 drwxr-xr-x(属主 mssql),但 cron 任务以 root 执行。 风险点:若目录内文件属主为 mssql 且权限为 700&…...
UniApp页面路由详解
一、路由系统概述 1.1 路由机制原理 UniApp基于Vue.js实现了一套跨平台的路由管理系统,其核心原理是通过维护页面栈来管理应用内不同页面之间的跳转关系。在小程序端,UniApp的路由系统会映射到对应平台的原生导航机制;在H5端则基于HTML5 Hi…...
探索无人机模拟环境的多元景象及AI拓展
无人驾驶飞行器(UAVs)在各行各业的迅速普及,从农业和检测到空中操作和人机交互等令人兴奋的前沿领域,都引发了一个关键需求:强大而逼真的模拟环境。直接在物理硬件上测试尖端算法存在固有的风险——成本高昂的坠机、中…...