JavaScript是运行在浏览器上的脚本语言。咱们平时看到丰富多彩的网页,这要在很大程度上归功于JavaScript。前端
引子 学点儿历史web
JavaScript在编程语言的阵营里也是老资格了。它诞生于1995年,由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成。因为Netscape与Sun合做,Netscape管理层但愿它外观看起来像Java,所以取名为JavaScript。编程
要知道,Java语言自其前身Oak语言在1992年诞生后,1995年才正式改名为Java,1996年1月,Sun公司才正式发布Java的第一个版本(JDK1.0)。浏览器
可见,就诞生时间而言,JavaScript可谓彻彻底底的老资格编程语言。数据结构
实际上,Netscape最初将其脚本语言命名为LiveScript,后来Netscape在与Sun合做以后将其更名为JavaScript。闭包
实际上,JavaScript最初受Java启发而开始设计,目的之一就是“看上去像Java”,所以语法上也有相似之处,甚至一些名称和命名规范也借自Java。但JavaScript的主要设计原则源自Self和Scheme。框架
在发展初期,JavaScript的标准并未肯定,同期有Netscape的JavaScript,微软的JScript和CEnvi的ScriptEase三足鼎立。编程语言
1997年,在ECMA(欧洲计算机制造商协会)的协调下,由Netscape、Sun、微软、Borland组成的工做组肯定统一标准:ECMA-262。函数
后来,Ecma国际以JavaScript为基础制定了ECMAScript标准。学习
Ecma国际的前身为欧洲计算机制造商协会,英文名称是European Computer Manufacturers Association,是一家国际性会员制度的信息和电信标准组织。在1994年以前,ECMA名为欧洲计算机制造商协会,后来因为计算机的国际化,该组织的标准也牵涉到不少其余国家,所以该组织决定更名代表其国际性,也就是现名称ECMA国际(Ecma International)。
能够说,ECMAScript是一种由Ecma国际经过ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用普遍,它每每被称为JavaScript或JScript,因此ECMAScript能够理解为是JavaScript的一个标准。实际上,JavaScript和JScript是ECMA-262标准的实现和扩展。
如今,完整的JavaScript包含三个部分:ECMAScript,文档对象模型DOM,浏览器对象模型BOM。
到此,历史回顾结束。
总的来讲,JavaScript由三个部分构成。
其中,ECMAScript规定了JavaScript的语法;BOM规定了JavaScript访问浏览器的标准,是JavaScript操做浏览器的接口;浏览器会加载文档,咱们在浏览器中看到的网页,就是浏览器加载的文档,DOM则规定了JavaScript操做网页文档的标准,是JavaScript操做网页文档的接口。
进入正题
JavaScript(简称“JS”)是一种弱类型的脚本语言。
与强类型语言Java不一样,JS中声明变量时,不须要显式声明变量的类型。JS中声明的变量会根据语法环境的须要进行相应的隐式类型转换。
JavaScript的数据类型主要分为两大类,一类是基本类型,另外一类是引用类型。
JavaScript中的基本类型包括4种,即string字符串,number数字,boolean布尔值,undefined。其中,undefined为变量声明后未赋值的情形。
引用类型又称为对象类型,对象分为普通对象(有时简称“对象”)和函数对象(有时简称“函数”)。普通对象属于Object类型,函数对象属于Function类型。同时,Function对象也都属于Object类型。
在上述图示中,分别列举了一个普通对象Object,以及一个函数对象Function。同时,Object和Function互为实例。
JavaScript中也存在一种特殊的继承关系,这种继承关系表如今一个赋值表达式的两侧中,左侧“继承"了右侧的数据结构,能够动态扩展右侧对象的数据结构。
另外,函数对象存在原型,普通对象则无原型属性。
函数对象能够经过原型prototype扩展其数据结构,也能够直接经过实例.属性扩展数据结构;函数对象的实例能够经过__proto__扩展其数据结构。
因为JavaScript能够在运行中动态改变数据结构,因此JavaScript也能够称为动态类型语言。
总的来讲,在JavaScript中,对象是键值对的组合。
原型是JavaScript的一大特色。
此外,JavaScript还有一个重要的概念,那就是闭包。
闭包听起来比较抽象,那么何为闭包呢?
对此,官方给出的解使是:一个拥有许多变量和绑定了这些变量的环境的表达式(一般是一个函数),于是这些变量也是该表达式的一部分。
一般来讲,当在一个函数内部再声明函数时,内部函数能够访问其所在的外部函数中声明的全部局部变量、参数和声明的其余内部函数。当一个这样的内部函数在包含它们的外部函数以外被调用时,就会造成闭包。从某种程度上来讲,闭包也是JavaScript语言的一种内在的,保留对词法环境下的资源进行访问的机制。
在JavaScript中,能够说,一切皆为对象,即使是基本类型的变量,也能够经过隐式建立对应包装类型的临时对象来做为对象使用。
在图中,外部函数中声明的局部变量,能够被其内部声明的其余内部函数使用。这之中就是闭包在起做用。从这个角度来看,闭包也是一种特殊的机制,可使得内部函数保留其对词法环境中资源的访问。
应该说,学习JavaScript,可以对原型与闭包有个清晰的认识,堪称学习到了JavaScript的精髓。
另外,JavaScript中的做用域主要分为全局做用域和局部做用域,由此引伸出全局变量和局部变量。
好比说,一个JavaScript脚本运行在一个浏览器窗口中,这个浏览器窗口对应一个window对象,JavaScript脚本中做用域在整个浏览器窗口以内的变量,就称为全局变量;那些仅局限在一个代码块或一个函数内的做用域的变量则称为局部变量。
在一个函数内部,若以var声明一个变量,那么这个变量就是一个局部变量;若是在函数内部直接声明一个变量,未添加var关键字,这个变量就是全局变量。
未在任一函数内部声明的变量,不管是否有var关键字修饰,均是全局变量。
谈谈BOM
JavaScript是一门灵活的脚本语言,其主要应用在于对浏览器,及浏览器加载的网页的操做。JavaScript是经过BOM操做浏览器的。
BOM的全拼是Browser Object Module,译为浏览器对象模型。BOM的顶级对象是window,表示一个打开的浏览器窗口。
上图中,document,location,navigation,history等既是window对象的属性,又是对象,所以又称为window对象的子对象。
window对象在JavaScript中做为全局Global对象,在调用全局对象的属性和方法时,全局对象能够省略。
好比,咱们平时见到的相似alert(),console()等方法能够直接调用,这些方法就是window对象的方法。对于window对象的这些方法,咱们能够经过window对象名来调用,也能够省略window对象名进行直接调用。
咱们平时在JavaScript脚本中定义的全局变量,都可以做为window对象的属性。
另外,window对象的属性和方法能够动态扩展。
直接声明全局变量做为window对象的属性,以及声明window对象的属性做为全局变量,二者有一些区别。好比,直接声明的全局变量不能经过delete删除,而声明的window对象的属性能够经过delete删除。
总的来讲,BOM中最重要的对象非window对象莫属。window对象不只是BOM定义的顶级对象,仍是JavaScript中的全局对象。不过,BOM目前没有统一的标准,各浏览器厂商(如Chrome,Opera,Firefox,Safari等)各自对BOM有着不一样的实现。在web前端开发中,一般须要作浏览器兼容,根源就在于各浏览器厂商的BOM模型不统一形成的。
另外,BOM模型中的window对象有个属性document,这个属性仍是一个对象,它是DOM的顶级对象。
聊聊DOM
DOM的全拼是Document Object Module,译为文档对象模型。咱们平时用JavaScript脚本操做网页中的元素,就是经过DOM来操做的。能够说,DOM是JavaScript脚本操做网页元素的接口。
DOM的标准是统一的,其标准制定者是W3C。所以,DOM不须要作浏览器兼容,在浏览器平台上的标准是统一的。
DOM的顶级对象是document,这是BOM中定义的window对象的一个子对象。DOM从结构上看,是一颗“树”:
咱们平时打开浏览器并访问网页,顺序是这样的:浏览器经过各自的BOM经过DOM加载网页文档,当网页文档在浏览器中被加载完毕时,JavaScript能够经过获取网页元素来操做这些元素,从而实现特定的效果。
应该说,JavaScript语言入门并不太难,难在懂得其内在运行原理。同时,因为JavaScript普遍的用途,以及简化的须要,也产生了很多JavaScript框架,比较著名的有jQuery,easyUI等。要深刻掌握这些JavaScript框架,就离不开洞悉JavaScript的运行原理。
到此,相信您对JavaScript已经有了一个清晰的了解,接下来的工做,请结合实际应用,进行足够的有效练习,相信您必定可以玩转JavaScript!