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 相关文章推荐
基于jquery的15款幻灯片插件
Apr 10 Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
Aug 28 Javascript
javascript实现tabs选项卡切换效果(自写原生js)
Mar 19 Javascript
浅析JavaScript 调试方法和技巧
Oct 22 Javascript
jQuery+Ajax实现无刷新分页
Oct 30 Javascript
最常见的左侧分类菜单栏jQuery实现代码
Nov 28 Javascript
jQuery UI仿淘宝搜索下拉列表功能
Jan 10 Javascript
Javascript同时声明一连串(多个)变量的方法
Jan 23 Javascript
Vuex之理解state的用法实例
Apr 19 Javascript
微信小程序template模板与component组件的区别和使用详解
May 22 Javascript
新手入门js闭包学习过程解析
Oct 08 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
Mar 01 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
一些关于PHP的知识
2006/11/17 PHP
提高PHP编程效率的53个要点(经验小结)
2010/09/04 PHP
PHP curl 并发最佳实践代码分享
2012/09/05 PHP
PHP反射类ReflectionClass和ReflectionObject的使用方法
2013/11/13 PHP
php基于GD库画五星红旗的方法
2015/02/24 PHP
Yii rules常用规则示例
2016/03/15 PHP
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
php+js实现点赞功能的示例详解
2020/08/07 PHP
js 图片缩放(按比例)控制代码
2009/05/27 Javascript
javascript比较语义化版本号的实现代码
2016/09/09 Javascript
原生js实现图片放大缩小计时器效果
2017/01/20 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
2017/03/07 Javascript
详解vue渲染函数render的使用
2017/12/12 Javascript
js+html5实现手机九宫格密码解锁功能
2018/07/30 Javascript
JS实现滚动条触底加载更多
2019/09/19 Javascript
vue基于better-scroll仿京东分类列表
2020/06/30 Javascript
[01:32]DOTA2上海特锦赛现场采访:最想COS的英雄
2016/03/25 DOTA
[03:46]DAC趣味视频-中文考试.mp4
2017/04/02 DOTA
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
Python实现Linux下守护进程的编写方法
2014/08/22 Python
跟老齐学Python之从格式化表达式到方法
2014/09/28 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
Django框架HttpResponse对象用法实例分析
2019/11/01 Python
Django配置Bootstrap, js实现过程详解
2020/10/13 Python
Pandas的数据过滤实现
2021/01/15 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
2021/02/02 Python
在职人员函授期间自我评价分享
2013/11/08 职场文书
会计学个人自荐信模板
2013/12/13 职场文书
酒店经理职责
2014/01/30 职场文书
销售提升方案
2014/06/07 职场文书
学习张林森心得体会
2014/09/10 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
《蚂蚁和蝈蝈》教学反思
2016/02/22 职场文书
MySQL系列之十二 备份与恢复
2021/07/02 MySQL
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android