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 相关文章推荐
文字幻灯片
Jun 26 Javascript
Javascript Math ceil()、floor()、round()三个函数的区别
Mar 09 Javascript
js 全兼容可高亮二级缓冲折叠菜单
Jun 04 Javascript
YUI Compressor压缩JavaScript原理及微优化
Jan 07 Javascript
jquery parent和parents的区别分析
Oct 02 Javascript
JQuery的$和其它JS发生冲突的快速解决方法
Jan 24 Javascript
JAVASCRIPT代码编写俄罗斯方块网页版
Nov 26 Javascript
简单介绍JavaScript数据类型之隐式类型转换
Dec 28 Javascript
微信小程序 动态绑定事件并实现事件修改样式
Apr 13 Javascript
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
Dec 01 Vue.js
vscode中使用npm安装babel的方法
Aug 02 Javascript
vue实现登陆页面开发实践
May 30 Vue.js
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
phpcms中的评论样式修改方法
2016/10/21 PHP
PHP中函数gzuncompress无法使用的解决方法
2017/03/02 PHP
PHP实现的简单AES加密解密算法实例
2017/05/29 PHP
javascript 复杂的嵌套环境中输出单引号和双引号
2009/05/26 Javascript
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
js实现checkbox全选、不选与反选的方法
2015/02/09 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
JavaScript中数组的各种操作的总结(必看篇)
2017/02/13 Javascript
jquery拖动改变div大小
2017/07/04 jQuery
jQuery ajax调用webservice注意事项
2017/10/08 jQuery
使用Vue.js和Element-UI做一个简单登录页面的实例
2018/02/23 Javascript
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
vue data对象重新赋值无效(未更改)的解决方式
2020/07/24 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
python 不关闭控制台的实现方法
2011/10/23 Python
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
python利用微信公众号实现报警功能
2018/06/10 Python
python自动发送邮件脚本
2018/06/20 Python
python 实现数字字符串左侧补零的方法
2018/12/04 Python
python 格式化输出百分号的方法
2019/01/20 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
Python版中国省市经纬度
2020/02/11 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
2020/02/12 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
美国领先的在线邮轮旅游公司:CruiseDirect
2018/06/07 全球购物
高考备战决心书
2014/03/11 职场文书
节能减耗标语
2014/06/21 职场文书
授权委托书怎么写
2014/09/25 职场文书
初中作文评语
2014/12/25 职场文书
详解Mysql 函数调用优化
2021/04/07 MySQL
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python
Python机器学习之基于Pytorch实现猫狗分类
2021/06/08 Python