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 相关文章推荐
IE不出现Flash激活框的小发现的js实现方法
Sep 07 Javascript
详细分析JavaScript函数定义
Jul 16 Javascript
JS使用正则表达式除去字符串中重复字符的方法
Nov 05 Javascript
JavaScript中的函数(二)
Dec 23 Javascript
详解Bootstrap四种图片样式
Jan 04 Javascript
JS中frameset框架弹出层实例代码
Apr 01 Javascript
浅析Javascript中bind()方法的使用与实现
May 30 Javascript
基于JavaScript代码实现自动生成表格
Jun 15 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
Sep 14 Javascript
微信小程序 setData的使用方法详解
Apr 20 Javascript
Vue中如何实现轮播图的示例代码
Jul 27 Javascript
ElementUI Tag组件实现多标签生成的方法示例
Jul 08 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
定义php常量的详解
2013/06/09 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
2014/05/04 PHP
destoon数据库表说明汇总
2014/07/15 PHP
PHP操作Redis数据库常用方法示例
2018/08/25 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
2019/03/22 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
客户端静态页面玩分页
2006/06/26 Javascript
javascript实现的使用方向键控制光标在table单元格中切换
2010/11/17 Javascript
javascript中自定义对象的属性方法分享
2013/07/12 Javascript
javascript打印html内容功能的方法示例
2013/11/28 Javascript
Javascript中克隆一个数组的实现代码
2013/12/06 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
三种AngularJS中获取数据源的方式
2016/02/02 Javascript
node.js实现博客小爬虫的实例代码
2016/10/08 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
bootstrap导航条实现代码
2016/12/28 Javascript
浅析Vue中method与computed的区别
2018/03/06 Javascript
JavaScript实现区块链
2018/03/14 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
[01:29:31]VP VS VG Supermajor小组赛胜者组第二轮 BO3第一场 6.2
2018/06/03 DOTA
Python变量和数据类型详解
2017/02/15 Python
关于Python中空格字符串处理的技巧总结
2017/08/10 Python
python中正则表达式的使用方法
2018/02/25 Python
python 浅谈serial与stm32通信的编码问题
2019/12/18 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
2020/03/18 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
Canvas获取视频第一帧缩略图的实现
2020/11/11 HTML / CSS
Skyscanner台湾:全球知名的旅行比价引擎
2018/07/01 全球购物
交通专业个人自荐信格式
2013/09/23 职场文书
毕业生个人的求职信范文
2013/12/03 职场文书
职员竞岗演讲稿
2014/05/14 职场文书
小学生常见病防治方案
2014/06/06 职场文书
2014年党员自我评议(5篇)
2014/09/12 职场文书
Redis持久化与主从复制的实践
2021/04/27 Redis