在 JavaScript 中,执行上下文和作用域是非常重要的概念。执行上下文是代码被执行时所处的环境,包括变量对象、作用域链、this 等信息。作用域是指在代码中定义变量的区域,决定了变量的可见性和生命周期。 下面是一些 JavaScript 中执行上下文和作用域的示例: 执行上下文
function sayHello(name) {
console.log(`Hello, ${name}!`);
}
sayHello("Alice");
// 输出:Hello, Alice!
// 执行上下文:
// - 变量对象:包括 arguments 对象和函数中定义的变量
// - 作用域链:指向函数的父级作用域,即全局作用域
// - this:指向全局对象,因为该函数不是作为对象的方法调用的作用域
let a = 10;
function foo() {
let b = 20;
console.log(a, b);
}
foo(); // 输出:10 20
console.log(a, b); // 报错,b 不在当前作用域中
// 作用域:
// - 全局作用域:包含全局变量 a 和函数 foo
// - 函数作用域:包含函数内部定义的变量 b作用域链
let a = 10;
function foo() {
let b = 20;
function bar() {
let c = 30;
console.log(a, b, c);
}
bar();
}
foo(); // 输出:10 20 30
// 作用域链:
// - bar 函数的变量对象
// - foo 函数的变量对象
// - 全局变量对象需要注意的是,在 JavaScript 中,函数可以访问其外部作用域中的变量。这个特性被称为闭包,它允许函数在执行完后仍然可以访问其外部作用域中的变量。下面是一个闭包的示例:
function outer() {
let a = 10;
function inner() {
console.log(a);
}
return inner;
}
let fn = outer();
fn(); // 输出:10在上面的示例中,inner 函数访问了其外部作用域中的变量 a,由于返回了 inner 函数,所以 fn 变量也可以访问变量 a。这种特性被称为函数的闭包。