二维码

JavaScript 作用域

JavaScript 作用域

作用域决定了变量的可访问性(可见性)。

JavaScript 有 3 种类型的作用域:

  • 块作用域
  • 函数作用域
  • 全局作用域

块作用域

在 ES6 (2015) 之前,JavaScript 只有全局作用域和函数作用域

ES6 引入了两个重要的新 JavaScript 关键字:letconst.

这两个关键字在 JavaScript 中提供了块作用域

无法访问 { } 块内声明的变量 从块外:

1
2
3
4
{  
  let x = 2;
}
// x can NOT be used here

使用关键字var声明的变量不能具有块作用域。

可以在 { } 块中声明的变量可以从 在街区外。

1
2
3
4
{  
  var x = 2;
}
// x CAN be used here

本地作用域

在 JavaScript 函数中声明的变量,变为 LOCAL 函数。

1
2
3
4
5
6
7
8
// code here can NOT use carName  

function myFunction() {
  let carName = "Volvo";
  // code here CAN use carName
}

// code here can NOT use carName

局部变量具有函数作用域

只能从函数内部访问它们。

由于局部变量仅在其函数内部被识别,因此具有相同名称的变量可以在不同的函数中使用。

局部变量在函数启动时创建,在函数完成时删除。


函数作用域

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

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

var声明的变量letconst是在函数中声明时非常相似。

它们都有函数作用域

1
2
3
4
5
6
7
8
9
10
11
function myFunction() {  
  var carName = "Volvo";   // Function Scope
}

function myFunction() {
  let carName = "Volvo";   // Function Scope
}

function myFunction() {
  const carName = "Volvo";   // Function Scope
}

全局 JavaScript 变量

在函数外部声明的变量变为 GLOBAL

1
2
3
4
5
6
let carName = "Volvo";  
// code here can use carName

function myFunction() {
// code here can also use carName
}

全局变量具有全局作用域

网页上的所有脚本和函数都可以访问它。


全局作用域

声明全局(在任何函数之外)的变量具有全局作用域

全局变量可以从 JavaScript 程序中的任何位置访问。

var声明的变量letconst是 在块外声明时非常相似。

它们都具有全局范围

1
2
3
4
5
var x = 2;       // Global scope

let x = 2;       // Global scope

const x = 2;       // Global scope

JavaScript 变量

在 JavaScript 中,对象和函数也是变量。

作用域确定变量、对象和函数的可访问性 代码的不同部分。


自动全局

如果为尚未声明的变量赋值,则该变量将自动成为 GLOBAL 变量。

此代码示例将声明一个全局变量,即使carName值在函数内部分配。

1
2
3
4
5
6
7
myFunction();  

// code here can use carName

function myFunction() {
  carName = "Volvo";
}


严格模式

所有现代浏览器都支持在“严格模式”下运行 JavaScript。

在本教程的后面章节中,您将了解有关如何使用严格模式的更多信息。

在“严格模式”中,未声明的变量不会自动全局。


HTML中的全局变量

对于 JavaScript,全局范围是 JavaScript 环境。

在 HTML 中,全局范围是 window 对象。

用关键字var定义的全局变量属于 window 对象:

1
2
var carName = "Volvo";  
// code here can use window.carName

使用关键字let定义的全局变量不属于 window 对象:

1
2
let carName = "Volvo";  
// code here can not use window.carName


警告

除非您打算创建全局变量,否则不要创建全局变量。
全局变量(或函数)可以覆盖窗口变量(或 函数)。
任何函数(包括 window 对象)都可以覆盖全局 变量和函数。


JavaScript 变量的生存期

JavaScript 变量的生存期从声明时开始。

函数完成时,将删除函数(局部)变量。

在 Web 浏览器中,关闭浏览器时会删除全局变量 窗口(或选项卡)。


函数参数

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