JavaScript 作用域
作用域决定了变量的可访问性(可见性)。
JavaScript 变量有 3 种作用域
- 块作用域
- 函数作用域
- 全局作用域
块作用域
在 ES6 (2015) 之前,JavaScript 变量只有全局作用域和函数作用域。
ES6 引入了两个重要的 JavaScript 新关键字:let
和 const
。
这两个关键字在 JavaScript 中提供了块作用域。
在 { } 块内声明的变量不能从块外访问
示例
{
let x = 2;
}
// 此处不能使用 x
使用 var
关键字声明的变量不能具有块作用域。
在 { } 块内声明的变量可以从块外访问。
示例
{
var x = 2;
}
// 此处可以使用 x
局部作用域
在函数内声明的变量对该函数是局部的
示例
// 此处的代码不能使用 carName
function myFunction() {
let carName = "Volvo";
// 此处的代码可以使用 carName
}
// 此处的代码不能使用 carName
自己动手试一试 »
局部变量具有函数作用域
它们只能在函数内部访问。
由于局部变量只能在其函数内识别,因此不同函数可以使用同名变量。
局部变量在函数开始时创建,并在函数完成时删除。
函数作用域
JavaScript 具有函数作用域:每个函数都会创建一个新的作用域。
在函数内部定义的变量无法从函数外部访问(可见)。
使用 var
、let
和 const
声明的变量在函数内部声明时非常相似。
它们都具有函数作用域
function myFunction() {
var carName = "Volvo"; // 函数作用域
}
function myFunction() {
let carName = "Volvo"; // 函数作用域
}
function myFunction() {
const carName = "Volvo"; // 函数作用域
}
全局 JavaScript 变量
在函数外部声明的变量会变成全局变量。
示例
let carName = "Volvo";
// 此处的代码可以使用 carName
function myFunction() {
// 此处的代码也可以使用 carName
}
自己动手试一试 »
全局变量具有全局作用域
网页上的所有脚本和函数都可以访问它。
全局作用域
全局声明的变量(任何函数外部)具有全局作用域。
全局变量可以从 JavaScript 程序的任何位置访问。
在块外部声明的变量(使用 var
、let
和 const
)非常相似。
它们都具有全局作用域
var x = 2; // 全局作用域
let x = 2; // 全局作用域
const x = 2; // 全局作用域
JavaScript 变量
在 JavaScript 中,对象和函数也是变量。
作用域决定了变量、对象和函数在代码不同部分的可访问性。
自动全局
如果你给一个未声明的变量赋值,它将自动成为全局变量。
此代码示例将声明一个全局变量 carName
,即使该值是在函数内部赋值的。
严格模式
所有现代浏览器都支持在“严格模式”下运行 JavaScript。
在本教程的后续章节中,您将了解更多关于如何使用严格模式。
在“严格模式”下,未声明的变量不会自动成为全局变量。
HTML 中的全局变量
使用 JavaScript,全局作用域是 JavaScript 环境。
在 HTML 中,全局作用域是 window 对象。
使用 var
关键字定义的全局变量属于 window 对象
使用 let
关键字定义的全局变量不属于 window 对象
警告
除非您打算这样做,否则请勿创建全局变量。
您的全局变量(或函数)可能会覆盖 window 变量(或函数)。
任何函数,包括 window 对象,都可以覆盖您的全局变量和函数。
JavaScript 变量的生命周期
JavaScript 变量的生命周期从声明开始。
函数(局部)变量在函数完成时被删除。
在 Web 浏览器中,全局变量在关闭浏览器窗口(或选项卡)时被删除。
函数参数
函数参数(形参)在函数内部充当局部变量。