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


Posted in Javascript onSeptember 12, 2015

在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;

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源码当成一个函数,是为了后面讲事件队列、事件循环做铺垫。

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

Javascript 相关文章推荐
javascript 混合的构造函数和原型方式,动态原型方式
Dec 07 Javascript
使用script的src实现跨域和类似ajax效果
Nov 10 Javascript
jQuery处理json数据返回数组和输出的方法
Mar 11 Javascript
jquery中添加属性和删除属性
Jun 03 Javascript
解析预加载显示图片艺术
Dec 05 Javascript
你真的了解BOM中的history对象吗
Feb 13 Javascript
JQuery中Ajax的操作完整例子
Mar 07 Javascript
jQuery简易时光轴实现方法示例
Mar 13 Javascript
微信小程序之滚动视图容器的实现方法
Sep 26 Javascript
vue和webpack打包项目相对路径修改的方法
Jun 15 Javascript
Node.js实现简单的爬取的示例代码
Jun 25 Javascript
详细分析Node.js 多进程
Jun 22 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
Sep 11 #Javascript
JS实现仿Windows7风格的网页右键菜单效果代码
Sep 11 #Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
Sep 11 #Javascript
js实现的后台左侧管理菜单代码
Sep 11 #Javascript
微信企业号开发之微信考勤Cookies的使用
Sep 11 #Javascript
微信企业号开发之微信考勤百度地图定位
Sep 11 #Javascript
JavaScript处理解析JSON数据过程详解
Sep 11 #Javascript
You might like
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
PHP 文件类型判断代码
2009/03/13 PHP
php模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
php pki加密技术(openssl)详解
2013/07/01 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
微信 开发生成带参数的二维码的实例
2016/11/23 PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
2019/03/21 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
Javascript 强制类型转换函数
2009/05/17 Javascript
JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
2010/05/13 Javascript
跨浏览器开发经验总结(四) 怎么写入剪贴板
2010/05/13 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
2015/03/31 Javascript
微信小程序上传图片实例
2018/05/28 Javascript
vue中组件的3种使用方式详解
2019/03/23 Javascript
JavaScript实现手风琴效果
2021/02/18 Javascript
[00:32]DOTA2上海特级锦标赛 Ehome战队宣传片
2016/03/03 DOTA
[01:01:41]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第二场 1月31日
2021/03/11 DOTA
详解python while 函数及while和for的区别
2018/09/07 Python
Python  unittest单元测试框架的使用
2018/09/08 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
python实现数据清洗(缺失值与异常值处理)
2019/12/02 Python
Python新手学习装饰器
2020/06/04 Python
Python无损压缩图片的示例代码
2020/08/06 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
python如何实现word批量转HTML
2020/09/30 Python
全面总结使用CSS实现水平垂直居中效果的方法
2016/03/10 HTML / CSS
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
资深财务管理人员自我评价
2013/09/22 职场文书
儿科主治医生个人求职信
2013/09/23 职场文书
应聘编辑职位自荐信范文
2014/01/05 职场文书
住宅使用说明书
2014/05/09 职场文书
井冈山红色之旅心得体会
2014/10/07 职场文书
元旦晚会主持词开场白
2015/05/28 职场文书
严以用权专题学习研讨会发言材料
2015/11/09 职场文书
Java中CyclicBarrier和CountDownLatch的用法与区别
2021/08/23 Java/Android