1. 局部变量和全局变量
全局变量:在函数外部声明的变量或在任何地方未使用var
、let
或const
关键字声明的变量(这会导致隐式全局变量)都是全局变量。全局变量在整个脚本中都是可访问的。
局部变量:在函数内部使用var
、let
或const
关键字声明的变量是局部变量。它们只能在声明它们的函数或代码块内部访问。
// 全局变量
var globalVar = "I am global";
function exampleFunction() {
// 局部变量
var localVar = "I am local";
console.log(localVar); // 输出: I am local
// console.log(globalVar); // 输出: I am global,全局变量在函数内也可访问
}
exampleFunction();
// console.log(localVar); // 会报错,localVar 是局部变量,在函数外不可访问
2. 隐式全局变量
如果在严格模式('use strict';
)下未使用var
、let
或const
声明变量,则会抛出错误。但在非严格模式下,未声明的变量会成为全局对象的属性,即隐式全局变量。
// 隐式全局变量(不推荐)
someVar = "I am implicitly global";
console.log(window.someVar); // 在浏览器中输出: I am implicitly global
3. 作用域和作用域链
作用域:变量可访问的范围。
作用域链:在嵌套函数中,内部函数可以访问外部函数的变量。这种访问是通过作用域链实现的,作用域链是从当前作用域开始,向上逐层查找变量,直到全局作用域。
function outerFunction() {
var outerVar = "I am from outer function";
function innerFunction() {
console.log(outerVar); // 输出: I am from outer function,通过作用域链访问外部变量
}
innerFunction();
}
outerFunction();
4. 闭包
闭包是指一个函数能够记住并访问它的词法作用域(即定义时的作用域),即使这个函数在其词法作用域之外执行。
function createCounter() {
let count = 0; // 私有变量
return function() {
count++;
return count;
};
}
const counter = createCounter();
console.log(counter()); // 输出: 1
console.log(counter()); // 输出: 2
5. 事件
事件是JavaScript中用于处理用户交互(如点击、键盘输入等)的机制。事件处理器是绑定到元素上的函数,当事件发生时,这些函数会被调用。
// 假设有一个按钮元素 <button id="myButton">Click me</button>
document.getElementById("myButton").addEventListener("click", function() {
alert("Button was clicked!");
});
练习题
- 声明一个全局变量和一个局部变量,并在函数内部和外部分别打印它们的值。
- 创建一个函数,该函数内部有一个局部变量和一个闭包,通过闭包访问并修改局部变量的值。
- 解释什么是作用域链,并给出一个使用作用域链访问外部函数变量的例子。
- 编写一个事件处理器,当用户在输入框中输入文本时,显示一个警告框,显示输入的文本。
- 解释什么是隐式全局变量,并说明为什么应该避免使用它们。