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() ... 没有名称表示符号。函数表达式可以匿名

匿名函数的缺点
  1. 匿名函数在栈追踪中不会显示出有意义的函数名称,难以调试;
  2. 如果没有函数名称,当函数需要引用自身时只能使用已经过期的arguments.callee引用,eg: 在递归中,另一个函数需要引用自身的例子,是在事件触发之后事件监听器需要解绑自身;
  3. 匿名函数省略对代码可读性/可理解性
    总的来说,给函数表达式命名是一个最佳实践:::
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;
}
posted @   Felix_Openmind  阅读(4)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
*{cursor: url(https://files-cdn.cnblogs.com/files/morango/fish-cursor.ico),auto;}
点击右上角即可分享
微信分享提示