JavaScript学习笔记(三):JavaScript也有入口Main函数

作者:青柠时间:2026-10-29 14:48:02浏览:189

本文解析JavaScript的执行机制,指出虽然JS从文件头部顺序执行,但可通过虚构Main函数统一其他语言入口概念。文章深入探讨全局作用域、全局对象及作用域链原理,解释变量绑定与this指向,为理解事件循环奠定基础。

JavaScript入口机制概述

在C和Java等语言中,程序通常由main函数或main方法作为入口点。相比之下,JavaScript程序的执行始于JS源文件的头部。然而,从概念层面构建一个虚构的main函数作为程序起点,不仅能使JavaScript与其他编程语言保持入口形式的一致性,还有助于深入理解JS的执行机制。

实际的执行入口

1. 实际的入口

当JavaScript文件被JS引擎加载并执行时,引擎会按照代码出现的顺序,从上至下逐条执行语句,直至完成所有代码的处理。

作用域链与全局对象解析

2. 作用域链、全局作用域和全局对象

JavaScript中,每个函数的执行都会创建一个新的作用域。具体而言,当执行流进入函数时,会建立该函数的作用域;当函数执行完毕退出时,该作用域通常会被销毁。函数的形参和局部变量均绑定于此作用域,随作用域销毁而被释放。但在特殊情况下,若函数返回时其内部变量仍被外部引用,则该作用域及其中变量不会被销毁,从而形成闭包。

此外,JavaScript支持函数嵌套,因此作用域也是嵌套的。在定义函数时,JS引擎会为每个函数设置一个名为[[scope]]的内置属性,该属性指向定义时外部函数的词法作用域。这种机制使得多个作用域形成链式结构,即作用域链。通常情况下,任意时刻仅存在一条作用域链,从当前正在执行的函数作用域开始,逐层向上追溯,直至最外层的全局作用域。

[注]:作用域链上的函数对应于JS源码中层层嵌套的函数定义,这与函数执行时的顺序或调用栈无关,这也是“词法作用域”这一名称的由来。

全局作用域是一种特殊的作用域,它并非由函数产生,但作为所有函数作用域的外层环境,它是所有作用域链的终点。只要程序保持运行状态,全局作用域及其内部变量将始终有效。

[函数3的作用域]-->[函数2的作用域]-->[函数3的作用域]-->[全局作用域]

与全局作用域相对应的是全局对象。在浏览器环境中,全局对象即为window对象。全局对象具有以下特殊性质:

在全局作用域中定义的变量,会自动绑定到全局对象。

在任意作用域中定义的变量,若定义时未使用var关键字,也会自动绑定到全局对象。

在全局作用域中,this关键字指向全局对象。

上述特性表明,若将全局作用域视为一个对象,则其本质即为全局对象。这也解释了为何在全局作用域中,以下四条语句具有等价性:


var a = 1;
a = 1;
window.a = 1;
this.a = 1;

虚构Main函数的构建

3. 虚构的main函数

既然存在各种作用域,为何需要特殊的全局作用域?人们倾向于简单性和一致性,避免复杂性及特殊性。因此,自然会产生疑问:能否使全局作用域看起来与函数作用域无异?答案是肯定的。我们可以进行如下构想:

我们假设,在JS引擎执行源文件时,会将文件中的代码包裹在一个名为main的函数中,并将该main函数作为程序的入口。 也就是说,假设一个JS文件中包含如下代码:


var a = 1;
var b = 2;

function add(x, y) {
  var z = x + y;
  return z;
}
console.log(add(a, b));

JS引擎在程序开始执行前,会将其包装为一个main函数:


// 虚构的main函数
function main() {
  var a = 1;
  var b = 2;

  function add(x, y) {
    var z = x + y;
    return z;
  }

  console.log(add(a, b));
}

随后,调用这个main函数:


main._current_scope_ = window; // 将全局作用域(对象)设为window
main.call(window) // 将this指向window

虚构Main函数的意义

4. 意义何在?

(1) JavaScript拥有了与其他语言一致的入口函数main。

(2) 简化了全局作用域的概念,或者说使全局作用域也表现为函数作用域。

(3) 通过上述main函数的调用过程,可以清晰理解全局作用域中那些特殊性质的来源。

(4) 最后一点,将所有JS源码视为一个函数,是为后续讲解事件队列和事件循环机制做铺垫。

以上就是小编给大家介绍的JavaScript学习笔记(三):JavaScript也有入口Main函数,希望大家喜欢。

作者最新文章