JavaScript 作用域

JavaScript 有 3 种作用域:块作用域,函数作用域、全局作用域。作用域决定了变量的可访问性(可见性)。

JavaScript 有 3 种作用域:块作用域,函数作用域、全局作用域。作用域决定了变量的可访问性(可见性)。

块作用域

块作用域在 ES6 (2015) 伴随着两个新的关键字 letconst 一块引入。ES6 (2015) 之前,JavaScript 只有全局作用域和函数作用域。

letconst 变量的作用域是块作用域

{...} 块内声明的变量不能从块外访问:

{
  let x = 2;
}
// 这里不能使用 x 变量

var 关键字在 {...} 块声明的变量的作用域是全局作用域,可以从块外访问。

{
  var x = 2;
}
// 这里可以使用使用 x

函数作用域

JavaScript 有函数作用域:每个函数都会创建一个新的作用域。

函数内部定义的变量不能从函数外部访问(可见)。

在函数内部用 var 声明的变量,与 letconst 变量一样,都具有函数作用域。

函数内部变量的作用域都是函数作用域:

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";

letconst 关键字定义的全局变量不属于 window 对象。

警告

除非出于特殊的目的,否则不要创建全局变量。

全局变量(或函数)可以覆盖窗口变量(或函数)。 任何函数,包括 window 对象,都可以覆盖您的全局变量和函数。

全局变量很容易引入不易查找的错误。

函数参数

函数参数(参数)在函数内部用作局部变量。