ch02 函数作用域和块作用域
JavaScript具有基于函数的作用域:每声明一个函数都会为其创建一个气泡,其他结构不会创建作用域气泡。
函数作用域的含义:属于这个函数的全部变量都可以在整个函数的范围内使用以及服用
隐藏内部实现
在任意代码片段外部添加包装函数,可以将内部的变量和函数定义‘隐藏’起来,外部作用域无法访问包装函数内部的任何内容
var a = 2; function foo() { var a =3; console.log(a); // 3 } foo(); console.log(a);
如何创建一个自执行或称之为不污染全局作用域的函数???
var a = 2; (function foo() { var a = 3; console.log(a); // 3 })(); console.log(a); // 2
匿名和具名
setTimeout(function() { console.log('I waited 1s !'); }, 1000);
称之为匿名函数表达式,function() ... 没有名称表示符号。函数表达式可以匿名
匿名函数的缺点
- 匿名函数在栈追踪中不会显示出有意义的函数名称,难以调试;
- 如果没有函数名称,当函数需要引用自身时只能使用已经过期的arguments.callee引用,eg: 在递归中,另一个函数需要引用自身的例子,是在事件触发之后事件监听器需要解绑自身;
- 匿名函数省略对代码可读性/可理解性
总的来说,给函数表达式命名是一个最佳实践:::
setTimeout(function timeoutHandler() { console.log('I waited 1s!'); }, 1000);
立即执行函数表达式(自执行函数)- Immediately Invoked Function Expression
var a = 2; (function foo() { var a = 3; console.log(a); // 3 })(); console.log(a); // 2
try/catch
try/catch的catch分局会创建一个块作用域,其中声明的变量仅仅在catch内部生效
try { undefined(); // 执行一个非法操作来强制制造一个异常 } catch(err) { console.log(err); // 能够正常执行 } console.log(err); // ReferenceError: err not found!
使用let进行声明不会在块作用域中进行变量提升。声明的代码被运行之前,声明并不‘存在’
{ console.log(bar); // ReferenceError! let bar = 2; }
学而不思则罔,思而不学则殆!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具