JavaScript 作用域
JavaScript 有 3 种作用域:块作用域,函数作用域、全局作用域。作用域决定了变量的可访问性(可见性)。
JavaScript 有 3 种作用域:块作用域,函数作用域、全局作用域。作用域决定了变量的可访问性(可见性)。
块作用域
块作用域在 ES6 (2015) 伴随着两个新的关键字 let
和 const
一块引入。ES6 (2015) 之前,JavaScript 只有全局作用域和函数作用域。
let
和 const
变量的作用域是块作用域。
在 {...}
块内声明的变量不能从块外访问:
{
let x = 2;
}
// 这里不能使用 x 变量
用 var
关键字在 {...}
块声明的变量的作用域是全局作用域,可以从块外访问。
{
var x = 2;
}
// 这里可以使用使用 x
函数作用域
JavaScript 有函数作用域:每个函数都会创建一个新的作用域。
函数内部定义的变量不能从函数外部访问(可见)。
在函数内部用 var
声明的变量,与 let
和 const
变量一样,都具有函数作用域。
函数内部变量的作用域都是函数作用域:
function myFunction() {
var carName = "Volvo"; // 函数作用域
}
function myFunction() {
let carName = "Volvo"; // 函数作用域
}
function myFunction() {
const carName = "Volvo"; // 函数作用域
}
全局变量
在函数外声明的变量变为全局变量。
let carName = "Volvo"; // 全局变量
// 这个函数 myFunction 也是全局函数
function myFunction() {
// 这里可以使用全局变量 carName
}
全局变量具有全局作用域:网页上的所有脚本和函数都可以访问它。
在函数或者块外定义的变量都具有全局作用域:
var x = 2; // 全局作用域
let x = 2; // 全局作用域
const x = 2; // 全局作用域
自动全局
如果你给一个没有声明的变量赋值,它会自动变成一个全局变量。
此代码示例将声明一个全局变量 carName
,即使该值是在函数内部分配的。
myFunction();
// code here can use carName
function myFunction() {
carName = "Volvo";
}
严格模式
所有现代浏览器都支持在“严格模式”下运行 JavaScript。
您将在本教程的后面章节中了解有关如何使用严格模式的更多信息。
在“严格模式”下,未声明的变量不会自动成为全局变量。
HTML 中的全局变量
在 HTML 中, window 对象是默认的全局对象,所有的全局变量和函数都术语 window 对象。。
var
关键字定义的全局变量属于 window 对象。
下面两行代码的作用是一样的:
var carName = "Volvo";
window.carName = "Volvo";
let
和 const
关键字定义的全局变量不属于 window 对象。
警告
除非出于特殊的目的,否则不要创建全局变量。
全局变量(或函数)可以覆盖窗口变量(或函数)。 任何函数,包括 window 对象,都可以覆盖您的全局变量和函数。
全局变量很容易引入不易查找的错误。
函数参数
函数参数(参数)在函数内部用作局部变量。