作用域指的是您有权访问的变量集合。
在 JavaScript 中有两种作用域:
- 局部作用域
- 全局作用域
函数作用域
JavaScript 拥有函数作用域:每个函数创建一个新的作用域。
作用域决定了这些变量的可访问性(可见性)。
函数内部定义的变量从函数外部是不可访问的(不可见的)。
局部变量
在函数中声明的变量,会成为函数的局部变量。
局部变量的作用域是局部,只能在函数内部使用。
函数参数也是函数内的局部变量。
// 此处的代码不能使用 name 变量
function myFunction() {
var name = "张三";
// 此处的代码能使用 name 变量
}
// 此处的代码不能使用 name 变量
全局变量
函数之外声明的变量为全局变量。
全局变量的作用域是全局的:网页的所有脚本和函数都能够访问它。
var name = "张三";
// 此处的代码能使用 name 变量
function myFunction() {
var name = "张三";
// 此处的代码能使用 name 变量
}
// 此处的代码能使用 name 变量
JavaScript 变量
在 JavaScript 中,对象和函数也是变量。
作用域决定了从代码不同部分对变量、对象和函数的可访问性。
自动全局
如果您为尚未声明的变量赋值,此变量会自动成为全局变量。
myFunction()
// 此处的代码能使用 name 变量
function myFunction() {
var name = "张三";
// 此处的代码能使用 name 变量
}
JavaScript 变量的有效期
JavaScript 变量的有效期始于其被创建时。
局部变量会在函数完成时被删除。
全局变量会在您关闭页面是被删除。
声明提升
提升(Hoisting)是 JavaScript 将声明移至顶部的默认行为
a = 1
console.log(a)
var a
初始化不会被提升
var a = 1
var c = a + b
console.log(c) // NaN
console.log(b) // undefined
var b = 2
let 和 const
let 或 const 声明的变量和常量不会被提升!
let
let 用来声明拥有块作用域的变量。let 定义的变量不会被提升到顶端。
// var
var a = 1
console.log('第一处:' + a) // 1
{
var a = 2
console.log('第二处:' + a) // 2
}
console.log('第三处:' + a) // 2
// 使用 let
var a = 1
console.log('第一处:' + a) // 1
{
let a = 2
console.log('第二处:' + a) // 2
}
console.log('第三处:' + a) // 1
const
通过 const 定义的变量与 let 变量类似,但不能重新赋值。
块级作用域。
const 变量必须在声明时赋值。
不是真正的常量
它没有定义常量值。它定义了对值的常量引用。
因此,我们不能更改常量原始值,但我们可以更改常量对象的属性。
// Object
const obj = {a: 1, b: 2}
obj.a = 3
console.log(obj) // {a: 3, b: 2}
// Array
var arr = [0,1,2]
arr[0] = 4
arr.push(8)
console.log(arr) // [4, 1, 2, 8]