JavaScript 全局作用域
什么是全局作用域?
在JavaScript中,全局作用域是指在代码中的任何地方都能访问到的变量、函数或对象所在的范围。它是作用域层级中的最顶层,也是JavaScript代码执行的默认环境。
当我们声明一个变量或函数时,如果不将其放在任何函数或块级作用域内,它就会自动成为全局作用域的一部分。
全局作用域的特性
1. 全局变量与全局对象
在浏览器环境中,全局作用域与全局对象window
紧密相关。在全局作用域中声明的变量和函数会自动成为window
对象的属性和方法。
// 全局变量
var globalVar = "我是全局变量";
console.log(window.globalVar); // "我是全局变量"
// 全局函数
function sayHello() {
console.log("Hello!");
}
window.sayHello(); // "Hello!"
备注
在Node.js环境中,全局对象是global
而不是window
。
2. 使用var、let和const声明全局变量的区别
在全局作用域中,使用不同的关键字声明变量会有一些细微差别:
// 使用var声明
var name = "小明";
console.log(window.name); // "小明" - 成为window对象的属性
// 使用let声明
let age = 25;
console.log(window.age); // undefined - 不会成为window对象的属性
// 使用const声明
const JOB = "程序员";
console.log(window.JOB); // undefined - 不会成为window对象的属性
3. 不使用声明关键字的变量赋值
在JavaScript中,如果不使用任何声明关键字(var
、let
或const
)而直接给一个变量赋值,这个变量会自动成为全局变量。
function createGlobalVar() {
localVar = "我本应是局部变量,但成了全局变量";
// 没有使用var、let或const声明
}
createGlobalVar();
console.log(localVar); // "我本应是局部变量,但成了全局变量"
console.log(window.localVar); // "我本应是局部变量,但成了全局变量"
注意
这是一种不良实践,很容易导致意外的全局变量污染。在严格模式('use strict')下,这种行为会抛出错误。