JavaScrpit 基础系列之作用域(八)

110 阅读2分钟

作用域指的是您有权访问的变量集合。

在 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]