JavaScript中函数与块级作用域可嵌套,但var、let、const因提升规则和绑定机制不同而行为各异:var在函数作用域提升并初始化为undefined;let/const受TDZ限制且块级绑定;严格模式下块级函数声明仅限块内有效;推荐统一使用let/const避免混淆。
JavaScript 中函数作用域和块级作用域可以嵌套,但行为受变量声明方式(
、
、
)严格约束,并非所有组合都“兼容”——关键在于提升(hoisting)规则与作用域绑定机制不同。
函数作用域内嵌套块级作用域:正常且推荐
在函数内部使用
创建块(如
、
或显式块),配合
/
声明,能实现清晰的局部绑定:
和
在块内声明,仅在该块中可访问,不会泄漏到外层函数作用域
在块内声明仍属于外层函数作用域,会被提升至函数顶部,可能引发意外覆盖或重复声明错误
示例中
后访问
会报
,而
则可在整个函数中读取
块级作用域内嵌套函数:完全支持,但需注意闭包与提升
在块中定义函数(ES6+ 允许块级函数声明),其行为取决于执行环境与严格模式:
非严格模式下,块级函数声明可能被提升到外围函数或全局作用域,行为不一致,应避免
严格模式下,块级函数声明仅在该块内有效,且不会被提升到块外;调用必须在声明之后
更稳妥的方式是使用函数表达式:
,它遵循
的块级绑定规则
与
混用时的嵌套陷阱
同一作用域层级混用不同声明方式,容易因提升差异导致逻辑错乱:
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
立即学习
“
Java免费学习笔记(深入)
”;
声明会被提升并初始化为
;
虽被提升但处于“暂时性死区”(TDZ),访问会抛错
若函数作用域中先用
,又在子块中用
,不会报错但
会绑定到函数作用域,实际形成两个不同绑定(不推荐)
最佳实践:统一使用
/
,避免
,从源头消除提升混淆
顶层作用域中的嵌套:全局对象绑定差异
在脚本顶层(非模块、非函数),
声明会成为全局对象(如
)属性,而
/
不会:
这意味着
后可通过
访问;
则不可
若在顶层块(如
)中声明,
仅在该块有效,且不挂载到全局对象
模块环境下(
),顶层也是块级作用域,
行为与函数内一致,不再自动挂载全局
varletconst{}ifforletconstletconstvarif (true) { let x = 1; }xReferenceErrorvar x = 1const fn = function() {}letvarlet/constvarundefinedlet/constlet xvar xvarletconstvarvarwindowletconstvar x = 1window.xlet y = 2if (true) { let z = 3; }ztype="module"var