JavaScript: Scope(域)的基本指南
在JavaScript中,Scope(作用域)是一个非常重要的概念。它决定了变量和函数的可见性和访问权限。正确理解和使用作用域可以帮助我们编写更清晰、可维护和可扩展的代码。
什么是Scope?
Scope是指在程序中定义变量的区域。在不同的作用域中,同名的变量可能会有不同的值或者不存在。在JavaScript中,一般有两种类型的作用域:全局作用域和局部作用域(函数作用域)。
全局作用域
全局作用域是指在整个程序中都可以访问的变量或函数。它们可以被任意一个函数调用。在浏览器环境下,全局作用域通常是Window对象。
// 声明一个全局变量 var globalVar = 'I am a global variable'; function foo() { console.log(globalVar); // 输出 "I am a global variable" } foo();
局部作用域(函数作用域)
局部作用域是指在函数内部声明的变量或函数,只能在当前函数内部访问。这些变量和函数在函数执行完毕后就会被销毁。局部作用域可以避免变量污染和命名冲突问题。
function bar() { var localVar = 'I am a local variable'; console.log(localVar); // 输出 "I am a local variable" } bar(); console.log(localVar); // 报错,localVar未定义
变量声明的方式
在JavaScript中,有三种方式可以声明变量:var、let和const。它们的作用域和生命周期略有不同。
var
使用var声明的变量,其作用域为当前函数或全局作用域。如果在函数内部声明一个没有使用var关键字的变量,该变量会被自动提升到函数开头,并且其值为undefined。
function baz() { console.log(a); // 输出 undefined var a = 'I am a variable'; console.log(a); // 输出 "I am a variable" } baz();
let
使用let声明的变量是块级作用域,只在当前代码块内有效,包括{}内的任何语句。它不能在声明之前访问,也不能重复声明同名变量。
// javascriptcn.com code example function qux() { let b = 'I am a variable'; console.log(b); // 输出 "I am a variable" if (true) { let b = 'I am another variable'; console.log(b); // 输出 "I am another variable" } console.log(b); // 输出 "I am a variable" } qux();
const
使用const声明的变量也是块级作用域,但其值不能被修改。一旦被赋值,就不能再次赋值。如果是引用类型的值(对象或数组),可以修改其属性或元素,但不能重新赋值。
// javascriptcn.com code example const c = 7; c = 8; // 报错,Assignment to constant variable. const d = { name: 'Alice' }; d.name = 'Bob'; // 可以修改属性 console.log(d); // 输出 { name: 'Bob' } const e = [1, 2, 3]; e.push(4); // 可以添加元素 console.log(e); // 输出 [1, 2, 3, 4] e = [5, 6, 7]; // 报错,Assignment to constant variable.
作用域链
当JavaScript代码中访问一个变量时,会按照作用域链从内向外查找该变量。作用域链是由当前作用域和上层作用域构成的。
var > 来源:[JavaScript中文网](https://www.javascriptcn.com/post/32108) ,转载请注明来源 [https://www.javascriptcn.com/post/32108](https://www.javascriptcn.com/post/32108)