惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
Stack Overflow Blog
Stack Overflow Blog
L
LINUX DO - 最新话题
Google Online Security Blog
Google Online Security Blog
Schneier on Security
Schneier on Security
Spread Privacy
Spread Privacy
www.infosecurity-magazine.com
www.infosecurity-magazine.com
雷峰网
雷峰网
Google DeepMind News
Google DeepMind News
Microsoft Azure Blog
Microsoft Azure Blog
IT之家
IT之家
V
Vulnerabilities – Threatpost
K
Kaspersky official blog
S
Schneier on Security
B
Blog
The Register - Security
The Register - Security
SecWiki News
SecWiki News
Hacker News: Ask HN
Hacker News: Ask HN
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Security Affairs
T
The Blog of Author Tim Ferriss
G
Google Developers Blog
T
Tenable Blog
P
Proofpoint News Feed
Apple Machine Learning Research
Apple Machine Learning Research
D
DataBreaches.Net
S
Secure Thoughts
Security Latest
Security Latest
H
Heimdal Security Blog
The Hacker News
The Hacker News
O
OpenAI News
AWS News Blog
AWS News Blog
量子位
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
腾讯CDC
U
Unit 42
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志
T
The Exploit Database - CXSecurity.com
NISL@THU
NISL@THU
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Hugging Face - Blog
Hugging Face - Blog
The Last Watchdog
The Last Watchdog
Recorded Future
Recorded Future
V2EX - 技术
V2EX - 技术
爱范儿
爱范儿
F
Full Disclosure

博客园 - lzhdim

近十年最帅风冷!酷冷至尊V8 ACE 3DHP散热器评测:单塔能干翻双塔 20260723 - 个人小作品更新 C# 中读取CPU、硬盘和内存温度 雷柏VT3s MAX鼠标评测:中小手型用户也没有被遗忘 顶尖性能的小号电竞鼠标来了 JavaScript 中的原型与继承 1分钟查清局域网所有IP 20260714 - 个人小作品更新 WorkBuddy 完整教程手册 专为AI而生的企业级QLC SSD!长江存储PE501 61.44TB评测:超过1PB的写入测试 32GB显存才是第一生产力!英特尔锐炫 Pro B70评测:中小企业AI降本神器 JavaScript中的this关键字 C#开发的PopoSaver泡泡屏保应用 - 开源研究系列文章 - 个人小作品 6天不间断测试告诉你到底有多省电!米家空调巨省电大1.5匹评测:制冷峰值功率不超过500W 三倍双摄加持 + D-Log 2 曲线!大疆DJI OSMO Pocket 4P全面评测:补齐短板,化身口袋电影机 晶栈4.0闪存立威!长江存储致态TiPro9000 2TB SSD评测:缓外写入超4GB/s独一档 C# 多线程同步机制详解:原理、使用与性能对比 最受欢迎的 10 大免费 AI 工具 六种AI生意,从月入一万到月入十万 5个国产大模型实测对比2026:DeepSeek、Kimi、豆包、通义、智谱哪个好用 豆包、元宝、千问、Kimi、DeepSeek,这么多AI软件,到底该用哪个? 微软免费开源了一个 Linux 操作系统,没错!是微软出品 一次看懂5种咖啡冲煮方式:意式、手冲、法压、冷萃、摩卡壶到底有什么区别 120个 实用CSS 技巧汇总合集 JavaScript运算符与表达式详解 C#开发的ScreenSaver屏保应用 - 开源研究系列文章 - 个人小作品 WinForm 中跨线程操作 UI 的解决方案 JavaScript变量与数据类型详解 苹果良心!iOS 27适配设备公布:30款机型 7年前的iPhone 11还能升级 C++图形用户界面开发入门 10个不该免费的GitHub神级项目 JavaScript语言全面概述:从历史到现代实践 一张图看懂常见咖啡 C盘空间多出来4GB:谷歌服软 Chrome本地AI大模型可禁用、删除了 96GB显存运行230B大模型!七彩虹灵创K16笔记本评测:160W性能释放 AMD锐龙AI Max+ 395加持全能移动AI工作站 AI PC最强存储搭档!雷克沙NM1090 PRO 8TB固态评测:14400MB/s满速不缩水 C#已经不是当年的C#了——我用它写了个微秒级数据库引擎 EasyTool:轻量全能的 .NET 工具类库 SQL 入门 17:MySQL 数据类型:从字符串到 JSON 的全面解析 SQL 入门 16:SQL 事务隔离级别与死锁解析(易懂) 原相3955XM+TL3228主控!小米电竞鼠标2全面评测:原生双8K究竟有多强 PCIe 4.0火力全开:闪迪奥丁马仕GX 7100 NVMe SSD上手 超乎预料的千元级电竞主板!七彩虹iGame B850M Ultra-OC V14主板评测 SQL 入门 15:SQL 事务:从 ACID 到四种常见的并发问题 名人 - 我的闪存 C#性能优化技巧 SQL 入门 14:SQL 触发器与事件:自动化数据处理 38个实用的JavaScript 技巧 一款基于 .Net WinForm 开发的节点编辑器,纯 GDI 实现,体积仅 100+Kb Masuit.Tools:这个 C# 工具库 SQL 入门 13:SQL 存储过程与函数:封装逻辑与参数处理 49个 JavaScript 代码快捷技巧,让你在 2026 年成为代码高手 20260503 - 个人小作品更新 SQL 入门 12:SQL 视图:创建、修改与可更新视图 C#如何实现Windows系统桌面截图功能... 6999元AMD新旗舰首测!锐龙9 9950X3D2性能解禁:这颗U根本不是给游戏玩家造的 SQL 入门 11:日期时间格式化、IF、CASE的使用 基于C#的校时类库的实现及使用 - 开源项目研究文章 39g无打孔+原生双8K!雷柏VT0 Air MAX / VT3s Air MAX鼠标评测:轻到飞起还快到极致 WinForm 中控件自适应窗体变化 20260413 - 个人小作品更新 SQL 入门 10:SQL 内置函数:数值、字符串与时间处理 最强麒麟芯+自研风冷 华为Mate80 Pro MAX 风驰版全面评测:涡轮散热封神 性能稳到骨子里 WiFi8核心技术特性与性能分析 2026年最新AMD/Intel桌面CPU排名:多线程、单线程、游戏性能谁才是第一 用DG对C盘进行扩容 - 初学者系列 - 学习者系列 还有比它更强的OEM固态吗!长江存储PC550 1TB评测:不用散热片也能满速的PCIe 5.0 SSD SharpCompress:跨平台的 C# 压缩与解压库 SQL 入门 9:SQL 高级子查询:ANY、EXISTS 与多位置应用 盘点接私活20个最实用的 .NET 开源项目 C#中加载图片的资源释放 20260404 - 个人小作品更新 开启iphone的墙纸玻璃效果 可能是综合性能最强的PCIe 5.0 SSD!铠侠EXCERIA PRO G2 2TB评测:AIDA64线性写入全程不掉速 SQL 入门 8:SQL 复杂查询:子查询与ALL关键词 性能最强的锐龙AI 9 H 465轻薄本!华硕无畏Pro16锐龙版2026评测 4盘RAID 0读写超1100MB/s!希捷酷狼Pro 32TB硬盘评测:百万文件快速完成备份 项目(Project)、项目集(Program)、项目组合(Portfolio) SQL 入门 7:SQL 聚合与分组:函数、GROUP BY 与 ROLLUP
JavaScript作用域与闭包讲解
lzhdim · 2026-07-02 · via 博客园 - lzhdim

一、什么是作用域?简单来说, 作用域就是变量起作用的范围. 想象一下, 你在家里喊"开饭啦!",只有家里的人能听见; 在小区里喊, 整个小区都能听见; 在大街上喊...呃, 可能会被当成神经病. JavaScript的作用域也是类似的道理. 1) 全局作用域全局作用域就像是在大街上喊话, 所有人都能听见 (所有代码都能访问).

//全局变量, 在任何地方都能访问const globalMessage = "Hello World";
function sayHello() {  console.log(globalMessage); //可以访问全局变量}
sayHello(); //输出"Hello World"console.log(globalMessage); //同样可以访问

但是要注意, 滥用全局变量是个坏习惯! 就像你不会在大街上喊你的银行卡密码一样, 太多全局变量容易造成命名冲突和难以维护. 2) 函数作用域函数作用域就像是在自己家里说话, 只有家里人能听见

function familyMeeting() {  const secret = "咱家存款有100万!"; //函数作用域内的变量
  console.log(secret); //可以访问}
familyMeeting();// console.log(secret); //报错!外面访问不到secret

3) 块级作用域块级作用域是ES6引入的, 用letconst声明的变量只在{}内有效. 

if (true) {  let blockScoped = "我在块里面";  const alsoBlockScoped = "我也是";  var notBlockScoped = "我不是块作用域"; //var没有块级作用域}
console.log(notBlockScoped); //"我不是块作用域"// console.log(blockScoped); //报错// console.log(alsoBlockScoped); //报错

var没有块级作用域! 它只有函数作用域. 这也是为什么现在推荐用letconst. 二、作用域链

现在来点进阶的——作用域链. 想象你在公司里: 

1. 先在自己工位找文件(当前作用域)

2. 找不到就去部门公共区域找(外层作用域)

3. 还找不到就去公司档案室找(更外层作用域)

4. 最后可能去总部找(全局作用域)

JavaScript查找变量也是这样一层层往外找的: 

const company = "阿里"; //全局作用域
function department() {  const team = "前端"; //department函数作用域
  function myDesk() {    const name = "小明"; //myDesk函数作用域    console.log(name); //小明 (当前作用域)    console.log(team); //前端 (上一层作用域)    console.log(company); //阿里 (全局作用域)  }
  myDesk();}
department();

作用域链是在函数定义时就确定好的, 不是调用时确定的! 这就是所谓的"静态作用域". 三、闭包闭包是JavaScript中最强大的特性之一, 也是面试必问的. 1) 闭包是指那些能够访问自由变量的函数(自由变量是指在函数中使用, 但既不是函数参数也不是函数局部变量的变量).当一个函数记住并访问它所在的词法作用域时, 就产生了闭包, 即使这个函数是在当前词法作用域之外执行. 示例: 

function outer() {  const secret = "我爱JavaScript";
  function inner() {    console.log(secret); //访问外部函数的变量  }
  return inner;}
const myFunc = outer();myFunc(); //"我爱JavaScript"

这里inner函数就是一个闭包, 因为它记住了outer的作用域, 即使outer已经执行完毕了. 2) 闭包的作用1-创建私有变量

function createCounter() {  let count = 0; //这个变量外部无法直接访问
  return {    increment: function() {      count++;      console.log(count);    },    decrement: function() {      count--;      console.log(count);    }  };}
const counter = createCounter();counter.increment(); //1counter.increment(); //2counter.decrement(); //1// console.log(count); // 报错, count不可访问

3) 闭包的作用2-函数柯里化柯里化是把接受多个参数的函数变成接受单一参数的函数的过程

function multiply(a) {  return function(b) {    return a * b;  };}
const double = multiply(2);console.log(double(5)); console.log(double(10)); 
const triple = multiply(3);console.log(triple(5)); 

4) 闭包的作用3-模块模式现代模块系统的基础就是闭包

const myModule = (function() {  const privateVar = "我是私有的";
  function privateMethod() {    console.log(privateVar);  }
  return {    publicMethod: function() {      privateMethod();    }  };})();
myModule.publicMethod(); //"我是私有的"// myModule.privateMethod(); //报错// console.log(myModule.privateVar); //undefined

5) 闭包使用的注意事项闭包虽好, 也有风险, 内存泄漏风险: 因为闭包会保留对外部变量的引用, 所以如果不小心, 可能会导致内存无法被回收.示例:

//不好的例子function leakMemory() {  const hugeArray = new Array(1000000).fill("0");
  return function() {    console.log("我保留了hugeArray的引用");  };}
const leakyFunc = leakMemory();//即使leakMemory执行完毕, hugeArray也不会被回收

6) 闭包与this

const obj = {  name: "小明",  sayName: function() {    return function() {      console.log(this.name);    };  }};
obj.sayName()(); //输出什么?

答案是undefined! 因为内部函数的this指向全局对象(严格模式下是undefined),不是obj. 解决方案: 保存this引用 

const obj = {  name: "小明",  sayName: function() {    const self = this;    return function() {      console.log(self.name);    };  }};
obj.sayName()(); //"小明"

或者使用箭头函数

const obj = {  name"小明",  sayNamefunction() {    return () => {      console.log(this.name);    };  }};
obj.sayName()(); // "小明"