JavaScript随笔(三):JS也有入口函数Main

在C和Java中,都有一个程序的入口函数或方法,即main函数或main方法。而在JavaScript中,程序是从JS源文件的头部开始运行的。但是某种意义上,我们仍然可以虚构出一个main函数来作为程序的起点,这样一来不仅可以跟其他语言统一了,而且说不定你会对JS有更深的理解。

1. 实际的入口

当把一个JavaScript文件交给JS引擎执行时,JS引擎就是从上到下逐条执行每条语句的,直到执行完所有代码。

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

我们知道,JS中的每个函数在执行时都会产生一个新的作用域。具体来说,在执行流程进入函数时会建立一个新的作用域,在函数执行完成退出时会销毁这个作用域。函数的形参、局部变量都会绑定到这个作用域里,当函数调用完成作用域销毁时,它们随之被销毁。当然在特殊情况下,如果函数返回时作用域中的某些变量仍然被引用,那么作用域以及这些被引用的变量就不会被销毁,从而形成所谓的闭包

另一方面,我们知道函数是可以嵌套的,因而作用域也是可以嵌套的。函数在定义的时候,JS引擎会给每个函数设置一个称为[[scope]]内置属性,它指向外部函数的词法作用域。通过这种方式,多个作用域形成了链式结构,称为作用域链。通常情况下,在任意时刻只存在一条作用域链,即从正在执行的函数的作用域开始,层层上溯,直到最外层的全局作用域

[注]:作用域链上的函数就是JS源码里的层层嵌套的函数,跟函数执行时的顺序或函数调用栈无关,这也是词法作用域这个称呼的由来。

全局作用域是一个特殊的作用域,它不是一个函数作用域,但它是所有函数作用域的外层作用域,也是所有作用域链的终点。因此只要程序没有退出,全局作用域总是存在的,全局作用域内的变量也是一直有效的。

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

另外,对应于全局作用域,还有一个全局对象。在浏览器中,全局对象就是window对象。全局对象是个特殊的对象:

  • 在全局作用域中定义的变量,都会绑定到全局对象。
  • 在任意作用域中定义的变量,如果定义时没有用 var 关键字,都会绑定到全局对象。
  • 在全局作用域中, this 指向全局对象。

从上面列举的这些特性可以看出,如果把全局作用域当成一个对象的话,那么实际上它就是全局对象。另外,这也解释了在全局作用域中,下面的四条语句为什么是等价的:

var a = 1; // 绑定到当前作用域(在这里就是全局作用域)
a = 1; // 绑定到全局作用域
window.a = 1; // 绑定到全局对象
this.a = 1; // 绑定到this

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

4. 意义何在?

(1) JS也有了入口函数main,跟其他语言一致了。

(2) 省去了全局作用域的概念,或者说全局作用域也成了函数作用域。

(3) 通过上面对main函数的调用过程,可以明白全局作用域中的那些特殊性质的由来。

(4) 最后一点,将所有JS源码当成一个函数,是为了后面讲事件队列、事件循环做铺垫。

 

转载于:https://www.cnblogs.com/manxisuo/p/JS-Note-3-Imaginary-Main-Function.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JavaScript函数是一种可重复使用的代码块,它可以接受输入参数并返回值。函数可以用来组织代码、减少重复代码、提高代码的可读性和可维护性。在JavaScript中,函数可以通过函数声明、函数表达式和箭头函数来定义。函数可以有任意数量的参数,也可以没有参数。函数可以返回任何类型的值,包括数字、字符串、布尔值、对象和函数等。函数可以在全局作用域或局部作用域中定义,也可以作为对象的方法来定义。在JavaScript中,函数是一等公民,可以作为参数传递给其他函数,也可以作为返回值返回给其他函数。 ### 回答2: JavaScript函数是一种非常重要的概念,它允许我们定义一段可重复使用的代码片段,同时还可以让我们更好的组织和管理程序的结构。在JavaScript中,函数可以作为一个值进行处理,可以使用函数表达式或函数声明定义。 函数声明是定义函数的最简单方式,它使用“function”关键字和函数名称来声明一个函数,例如: ``` function greeting() { console.log("Hello World"); } ``` 这里定义了一个简单的函数,功能是输出“Hello World”到控制台。我们可以通过使用函数名来调用它: ``` greeting(); ``` 输出结果为“Hello World”。 除了函数声明外,还有一种常见的函数定义方式——函数表达式。函数表达式是定义一个函数并将其赋值给一个变量,例如: ``` var greeting = function() { console.log("Hello World"); }; ``` 这里定义了一个变量greeting,并将一个匿名函数赋值给它。我们可以通过使用变量名来调用该函数: ``` greeting(); ``` 输出结果为“Hello World”。 JavaScript函数支持一个特殊的参数对象——arguments对象,它可以让我们在函数内部访问到所有传递给该函数的参数。例如: ``` function sum() { var result = 0; for (var i = 0; i < arguments.length; i++) { result += arguments[i]; } return result; } ``` 这里定义了一个函数sum,它可以计算任意数量的参数的和。我们可以使用以下代码来调用该函数并输出结果: ``` console.log(sum(1, 2, 3, 4)); //输出10 console.log(sum(10, 20)); //输出30 ``` 总的来说,JavaScript函数是一项非常重要的技能,它可以帮助我们更好的组织和管理我们的程序,并且可以帮助我们构建可重复使用的代码片段。掌握JavaScript函数,是掌握JavaScript编程的重要一步。 ### 回答3: JavaScript是目前世界上最流行的动态编程语言之一,已成为很多网站和Web应用程序的必选之一。JavaScript函数是编写高度可重复使用的代码和组织逻辑的基本组成部分,也是JavaScript编程的核心。随着Web应用场景的复杂化,函数JavaScript编程中的重要性越来越得到了认识和应用,学习和掌握JavaScript函数是很有必要的。 JavaScript函数与其他编程语言中的函数类似,是一个代码块,可以接受参数,返回值,并可重复使用。JavaScript函数有两种常用的定义方式,分别是函数声明和函数表达式。函数声明是指在代码中提前声明一个函数函数表达式是指将一个函数赋值给一个变量或常量。 在JavaScript函数中,参数和返回值都是可以选择性的。一个函数可以不需要参数也不需要返回值,也可以仅需要参数或仅需要返回值。使用参数可以让函数更加灵活和通用,参数可以是任何类型,包括字符串、数字、函数和对象等。返回值可以是任何JavaScript支持的类型,包括布尔类型、数字类型、字符串类型和数组等。 函数的作用域是JavaScript函数编程中的一个关键概念,它指的是一段代码能够访问和操作的变量和函数的范围。JavaScript函数有词法作用域,即变量的作用域取决于它们在代码中的位置,作用范围被限定在函数内部和它所嵌套的函数中。 常用的JavaScript函数应用包括数组和对象的处理、事件处理和DOM操作等。在Web开发中,JavaScript函数和jQuery库的结合应用很广泛,它可以极大地提高Web应用的交互性和用户体验。 总之,JavaScript函数是一个必须掌握的编程概念,它可以让我们的代码更加灵活、通用、数据安全、易使用和易维护。了解JavaScript函数的语法和应用场景,能够有效地提高JavaScript编程的效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值