高级javascript---变量作用域
变量作用域 (JavaScript)
JavaScript 有两个范围:全局和局部。 在函数定义之外声明的变量是全局变量,它的值可在整个程序中访问和修改。 在函数定义内声明的变量是局部变量。 每当执行函数时,都会创建和销毁该变量,且无法通过函数之外的任何代码访问该变量。 JavaScript 不支持块范围(通过一组大括号 {. . .} 定义新范围),但块范围变量的特殊情况除外。
// 定义全局变量aCentaur var aCentaur = "a horse with rider,"; //定义一个同名的局部变量 function antiquities(){ var aCentaur = "A centaur is probably a mounted Scythian warrior"; } antiquities(); aCentaur += " as seen from a distance by a naive innocent."; document.write(aCentaur); // 输出: "a horse with rider, as seen from a distance by a naive innocent."
在 JavaScript 中,变量就像它们在所在范围的开始被声明一样来计算。 有时,这会导致意外行为,如此处所示。
var aNumber = 100; tweak(); function tweak(){ // This prints "undefined", because aNumber is also defined locally below. document.write(aNumber); if (false) { var aNumber = 123; } }
当 JavaScript 执行一个函数时,它首先会查找所有变量声明,例如 var someVariable;。 它使用初始值undefined 创建变量。 如果使用一个值声明变量(例如 var someVariable = "something";),则该变量的初始值仍为 undefined,并且仅当执行包含声明的行时才采用已声明的值。
JavaScript 会在执行任何代码之前处理所有变量声明,无论是在条件块中声明还是在其他构造中声明。JavaScript 一旦找到所有变量,就会执行函数中的代码。 如果在函数内部隐式声明变量(即,该变量出现在赋值表达式的左侧但尚未使用 var 进行声明),则它将创建为全局变量。
在 JavaScript 中,内部(嵌套)函数将存储对局部变量的引用(即使在函数返回之后),这些局部变量存在于与函数本身相同的范围中。 这一组引用称为闭包。 在以下示例中,对内部函数的第二次调用所输出的消息与第一次调用相同(“Hello Bill”),因为外部函数的输入参数 name 是存储在内部函数闭包中的局部变量。
function send(name) { // Local variable 'name' is stored in the closure // for the inner function. return function () { sendHi(name); } } function sendHi(msg) { console.log('Hello ' + msg); } var func = send('Bill'); func(); // Output: // Hello Bill sendHi('Pete'); // Output: // Hello Pete func(); // Output: // Hello Bill
Internet Explorer 11 引入了对 let 和 const 这两个块范围变量的支持。 对于这些变量,大括号 {. . .} 定义新范围。 将其中一个变量设置为特定值时,该值仅适用于其设置所在的范围。
以下示例说明如何使用 let 和块范围。
说明 |
---|
以下代码在 Internet Explorer 11 标准模式及更高版本中受支持。 |
let x = 10; var y = 10; { let x = 5; var y = 5; { let x = 2; var y = 2; document.write("x: " + x + "<br/>"); document.write("y: " + y + "<br/>"); // Output: // x: 2 // y: 2 } document.write("x: " + x + "<br/>"); document.write("y: " + y + "<br/>"); // Output: // x: 5 // y: 2 } document.write("x: " + x + "<br/>"); document.write("y: " + y + "<br/>"); // Output: // x: 10 // y: 2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?