返回

掌握执行上下文,攻克JavaScript难题

前端

在JavaScript中,执行上下文决定了代码的执行环境,是代码运行的载体。它包含了代码运行所需的所有信息,包括变量、函数、参数等。

JavaScript的执行上下文只有两种,分别为:全局执行上下文和函数执行上下文。

全局执行上下文是JavaScript程序开始执行时创建的第一个执行上下文。它包含了所有全局变量和函数。

函数执行上下文是在函数被调用时创建的。它包含了函数的参数、局部变量和函数体。

调用栈是一个存储执行上下文的栈。当一个函数被调用时,它的执行上下文会被压入调用栈。当函数执行完毕后,它的执行上下文会被弹出调用栈。

闭包是指可以在其父函数之外访问父函数内部变量的函数。闭包的创建与函数的执行上下文有关。当一个函数执行完毕后,它的执行上下文会被弹出调用栈,但是它的作用域仍然存在。此时,该函数内部的变量仍然可以被访问,这就是闭包。

this指向当前执行上下文的调用对象。在全局执行上下文中,this指向window对象。在函数执行上下文中,this指向函数被调用的对象。

作用域是指变量和函数的可见范围。变量和函数的作用域取决于它们被定义的位置。全局变量和函数的作用域是整个程序,局部变量和函数的作用域是它们被定义的函数体。

执行上下文、调用栈、闭包、this和作用域是JavaScript中非常重要的概念,理解这些概念对理解JavaScript程序的执行过程非常有帮助。

以下是一些帮助您理解这些概念的示例:

  • 全局执行上下文:
var a = 1;
function b() {
  console.log(a);
}
b(); // 1
  • 函数执行上下文:
function a() {
  var b = 2;
  console.log(b);
}
a(); // 2
  • 调用栈:
function a() {
  b();
}
function b() {
  console.log(1);
}
a(); // 1
  • 闭包:
function a() {
  var b = 2;
  return function() {
    console.log(b);
  }
}
var c = a();
c(); // 2
  • this
var a = {
  b: 2,
  c: function() {
    console.log(this.b);
  }
}
a.c(); // 2
  • 作用域:
var a = 1;
function b() {
  var a = 2;
  console.log(a); // 2
}
b();
console.log(a); // 1

希望这些示例能帮助您更好地理解执行上下文、调用栈、闭包、this和作用域之间的关系。