函数声明在全局和局部作用域的核心区别在于可见性、存在时机与覆盖规则:全局声明挂载到全局对象、可提升且全脚本可用,同名后声明覆盖前者;局部声明仅限所在函数内访问、作用域随外层函数执行而创建,支持闭包。

函数声明在全局和局部作用域中的核心区别,不在于“能不能写”,而在于“谁能看到、什么时候存在、会不会被覆盖”。关键看声明位置和执行上下文,不是看调用位置。
全局作用域中的函数声明
在脚本顶层(<script>内最外层,或模块顶层)直接用 function name() {...} 声明的函数,属于全局作用域:
- 自动挂载到全局对象上(浏览器中是
window.name,Node.js 中是globalThis.name) - 具有函数提升(hoisting),可在声明前调用
- 生命周期贯穿整个页面/进程,直到关闭才销毁
- 多个同名全局函数声明会后者覆盖前者(无报错,静默替换)
局部作用域中的函数声明
在函数内部用 function name() {...} 声明的函数,属于该函数的局部作用域(即函数作用域):
- 仅在声明它的函数体内可访问,外部无法调用
- 同样会被提升,但只在当前函数作用域内有效
- 每次外层函数执行时,都会创建新的局部作用域,其中的函数声明也重新绑定
- 支持闭包:内部函数可访问外层函数的变量,即使外层已执行完毕
注意:块级作用域不适用于传统函数声明
function 声明本身没有块级作用域(ES6 之前和多数运行时中):
立即学习“Java免费学习笔记(深入)”;
- 在
if或for块中用function声明,行为因引擎而异(非标准),不推荐 - 想实现块级函数效果,应改用函数表达式 +
let/const:if (ok) { const fn = () => console.log('safe'); fn(); } - 箭头函数、
const fn = function() {...}等形式受let/const的块级规则约束
一个典型对比示例
全局声明:function greet() { return "Hello"; }
→ 页面任意位置都能调用 greet()
局部声明:function outer() { function inner() { return "Hi"; } return inner(); }
→ inner 只能在 outer 内部使用,inner() 在外部调用会报 ReferenceError


















