在 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。这种特性被称为函数的闭包。