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 $.isNumeric vs. $.isNaN vs. isNaN
Apr 15 Javascript
Javascript核心读书有感之表达式和运算符
Feb 11 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
Dec 01 Javascript
js格式化时间的方法
Dec 18 Javascript
JavaScript中instanceof运算符的使用示例
Jun 08 Javascript
详解Angular.js中$http拦截器的介绍及使用
Jul 04 Javascript
使用JavaScript实现一个小程序之99乘法表
Sep 21 Javascript
BootstrapTable加载按钮功能实例代码详解
Sep 22 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
Dec 13 Javascript
vue实现在线翻译功能
Sep 27 Javascript
基于Angular 8和Bootstrap 4实现动态主题切换的示例代码
Feb 11 Javascript
Vue使用Element实现增删改查+打包的步骤
Nov 25 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  实现等比压缩图片尺寸和大小实例代码
2016/10/08 PHP
PHP isset()与empty()的使用区别详解
2017/02/10 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
Prototype使用指南之selector.js说明
2008/10/26 Javascript
Jquery遍历checkbox获取选中项value值的方法
2014/02/13 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
2015/08/28 Javascript
Adapter适配器模式在JavaScript设计模式编程中的运用分析
2016/05/18 Javascript
jquery获取复选框checkbox的值实现方法
2016/05/30 Javascript
用headjs来管理和加载js 提高网站加载速度
2016/11/29 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
Js面试算法详解
2018/04/08 Javascript
node.js处理前端提交的GET请求
2019/08/30 Javascript
js实现坦克大战游戏
2020/02/24 Javascript
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
Python and、or以及and-or语法总结
2015/04/14 Python
python调用系统ffmpeg实现视频截图、http发送
2018/03/06 Python
VSCode下配置python调试运行环境的方法
2018/04/06 Python
解决pandas read_csv 读取中文列标题文件报错的问题
2018/06/15 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
2018/07/13 Python
python 实现在一张图中绘制一个小的子图方法
2019/07/07 Python
python烟花效果的代码实例
2020/02/25 Python
Flask中sqlalchemy模块的实例用法
2020/08/02 Python
python查询MySQL将数据写入Excel
2020/10/29 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
css3实现一款模仿iphone样式的注册表单
2013/03/20 HTML / CSS
英国最大的香水商店:The Fragrance Shop
2018/07/06 全球购物
eVitamins日本:在线购买折扣维生素、补品和草药
2019/04/04 全球购物
高中生毕业学习总结的自我评价
2013/11/14 职场文书
服装采购员岗位职责
2014/03/15 职场文书
测控技术自荐信
2014/06/05 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
导游词之重庆钓鱼城
2019/09/19 职场文书
创业计划书之韩国烧烤店
2019/09/19 职场文书
七年级作文之雪景
2019/11/18 职场文书