返回

函数、作用域链:剖析JavaScript中的重要概念

前端

在 JavaScript 中,函数是一等公民,这意味着它们可以像变量一样被赋值、传递和执行。函数不仅是强大的工具,也是理解 JavaScript 的关键。

函数

函数是代码的块,它可以被赋予一个标识符,并可以在程序中被调用。函数可以接收参数,并返回一个值。

function sum(a, b) {
  return a + b;
}

console.log(sum(1, 2)); // 3

作用域

作用域是程序中变量和函数的可见范围。JavaScript 中有两种作用域:全局作用域和局部作用域。

  • 全局作用域:在全局作用域中声明的变量和函数可以在程序的任何地方访问。
  • 局部作用域:在函数内部声明的变量和函数只在该函数内部可见。

闭包

闭包是具有访问权限的函数,使其在函数执行结束时仍然有效。

function makeAdder(x) {
  return function(y) {
    return x + y;
  };
}

const add5 = makeAdder(5);
console.log(add5(2)); // 7

变量提升

变量提升是指在 JavaScript 中,变量的声明会被提升到函数或块的顶部。

console.log(a); // undefined
var a = 1;

作用域链

作用域链是一个变量和函数查找顺序的列表。当JavaScript解释器在变量或函数中遇到一个标识符时,它会沿着作用域链向上查找,直到找到该标识符的声明为止。

function outer() {
  var a = 1;

  function inner() {
    console.log(a); // 1
  }

  inner();
}

outer();

this

在 JavaScript 中,this 指向当前执行函数的上下文。

function Person(name) {
  this.name = name;
}

Person.prototype.sayName = function() {
  console.log(this.name);
};

const person = new Person('John');
person.sayName(); // John

执行上下文

执行上下文是JavaScript解释器在执行代码时创建的环境。执行上下文包含当前执行函数的变量和函数、当前执行函数的参数、以及该函数的局部变量。

栈是 JavaScript 解释器用于管理执行上下文的结构。当一个函数被调用时,一个新的执行上下文被压入栈中。当函数执行完毕时,它的执行上下文被弹出栈。

JavaScript 函数

JavaScript 函数是程序的代码块,它们可以接收参数,并返回一个值。函数可以在程序的任何地方被调用。

function sum(a, b) {
  return a + b;
}

console.log(sum(1, 2)); // 3

匿名函数表达式

匿名函数表达式是JavaScript中没有函数名的函数。

const sum = function(a, b) {
  return a + b;
};

console.log(sum(1, 2)); // 3

arguments 对象

arguments 对象包含了传递给函数的所有参数。

function sum() {
  console.log(arguments);
}

sum(1, 2, 3); // Arguments { '0': 1, '1': 2, '2': 3 }

作用域链解释器

作用域链解释器是 JavaScript 解释器用于查找变量和函数的工具。当 JavaScript 解释器在变量或函数中遇到一个标识符时,它会沿着作用域链向上查找,直到找到该标识符的声明为止。

function outer() {
  var a = 1;

  function inner() {
    console.log(a); // 1
  }

  inner();
}

outer();

词法作用域

词法作用域是指函数的作用域由函数的定义决定,而与函数的调用无关。

function outer() {
  var a = 1;

  function inner() {
    console.log(a); // 1
  }

  return inner;
}

const inner = outer();
inner();

动态作用域

动态作用域是指函数的作用域由函数的调用决定,而与函数的定义无关。

function outer() {
  var a = 1;

  function inner() {
    console.log(a); // undefined
  }

  return inner;
}

const a = 2;
const inner = outer();
inner();

JavaScript 执行环境

JavaScript 执行环境是 JavaScript 解释器运行程序的上下文。执行环境包含全局对象、当前执行函数、当前执行函数的参数、以及该函数的局部变量。

JavaScript 变量声明

JavaScript 变量声明有三种方式:var、let 和 const。

  • var 声明的变量是全局变量或局部变量,并且可以重新赋值。
  • let 声明的变量是局部变量,并且可以重新赋值。
  • const 声明的变量是局部变量,并且不能重新赋值。
var a = 1;
let b = 2;
const c = 3;

希望这篇文章能够帮助您更好地理解 JavaScript 中的函数、作用域链和其他重要概念。