JavaScript函数作用域指function内声明的变量、函数仅在该函数内可访问;仅function创建作用域,{}不创建;var受函数作用域和变量提升影响,let/const为块级作用域;闭包依赖函数作用域但易致内存泄漏。

JavaScript 函数作用域指的是:在 function 内部声明的变量、函数,**默认只能在该函数内部被访问**,外部无法直接读取或修改。
函数作用域只认 function,不认 {}
很多人误以为用花括号 {} 就能创建作用域,但在 JavaScript(ES5 及之前)中,只有 function 声明会创建新的作用域。if、for、while 里的 {} 不构成作用域边界。
if (true) {
var x = 10;
}
console.log(x); // 输出 10 —— x 泄露到外层作用域了
而换成 function 就完全不同:
function foo() {
var y = 20;
}
foo();
console.log(y); // ReferenceError: y is not defined
-
var声明受函数作用域约束,但存在变量提升(hoisting) -
let和const是块级作用域,不受此规则限制 —— 它们属于 ES6 的新机制,和传统函数作用域是两套逻辑 - 箭头函数没有自己的
this,但它**完全继承外层函数作用域**,不会创建新作用域
var 在函数内多次声明不会报错,但行为容易误判
由于 var 存在变量提升 + 函数作用域,下面代码实际运行效果常让人困惑:
家电公司网站源码是一个以米拓为核心进行开发的家电商城网站模板,程序采用metinfo5.3.9 UTF8进行编码,软件包含完整栏目与数据。安装方法:解压上传到空间,访问域名进行安装,安装好后,到后台-安全与效率-数据备份还原,恢复好数据后到设置-基本信息和外观-电脑把网站名称什么的改为自己的即可。默认后台账号:admin 密码:132456注意:如本地测试中127.0.0.1无法正常使用,请换成l
立即学习“Java免费学习笔记(深入)”;
function bar() {
console.log(a); // undefined(不是 ReferenceError)
var a = 1;
if (false) {
var a = 2; // 这行声明会被提升,但赋值不会
}
console.log(a); // 1
}
- 所有
var a都被提升到bar顶部,等价于开头就写了var a; - 即使
if (false)不执行,var a = 2的声明仍生效(只是赋值跳过) - 这种“声明提升 + 函数作用域”组合,是调试时变量意外为
undefined的常见原因
闭包依赖函数作用域,但容易引发内存泄漏
闭包本质是:内部函数引用了外部函数的变量,而外部函数执行完毕后,这些变量**因被内部函数持有而未被释放**。
function createCounter() {
let count = 0;
return function() {
count++;
return count;
};
}
const inc = createCounter();
console.log(inc()); // 1
console.log(inc()); // 2
- 每次调用
createCounter()都生成一个独立的词法环境,count被保留在该环境中 - 如果返回的函数长期存活(比如绑定到全局对象、事件监听器、定时器),对应的外层变量就一直占着内存
- 尤其注意:用
var声明的变量在循环中创建闭包时,容易所有闭包共享同一个变量(经典 for + setTimeout 问题)
函数作用域看似简单,但和变量声明方式(var/let/const)、执行上下文、闭包生命周期紧密耦合。真正难的不是定义,而是判断某个变量在哪个时刻、被谁持有、能不能被回收。










