声明
本系列文章内容所有梳理自如下几个来源:javascript
- 《JavaScript权威指南》
- MDN web docs
- Github:smyhvae/web
- Github:goddyZhao/Translation/JavaScript
做为一个前端小白,入门跟着这几个来源学习,感谢做者的分享,在其基础上,经过本身的理解,梳理出的知识点,或许有遗漏,或许有些理解是错误的,若有发现,欢迎指点下。html
PS:梳理的内容以《JavaScript权威指南》这本书中的内容为主,所以接下去跟 JavaScript 语法相关的系列文章基本只介绍 ES5 标准规范的内容、ES6 等这系列梳理完再单独来说讲。前端
正文-相关术语
对于从 Java 或 C++ 转过来的开发人员来讲 JavaScript 会有点让人困惑,由于它所有都是动态的,都是运行时,并且不存在类机制。全部的都是实例对象。因此,学习一些 JavaScript 的语言特性时,最好不要试图从 Java 中寻找相关概念硬套过来,类比能够。java
接下去一系列关于 JavaScript 语法的文章中,将会出现不少在 Java 里出现或者没出现过的专业术语,因此第一篇就先来罗列一下,每一个术语先给必定的解释。git
有的理解不了不要紧,等这系列文章看完,再回过头来看这一张基本也都能理解了。先罗列出来,至少有个印象,不至于到时看到一脸懵逼。github
直接量
能够直接使用的数据值,即在程序中直接出现的数据值,如:web
"hello world" 123 {name:dasu} [] ...
等等这些直接出现可直接使用的数据值称为直接量,不一样数据类型有不一样的叫法,常见的有:数字直接量、字符串直接量、正则表达式直接量、对象直接量、数组直接量等。正则表达式
字面量
跟直接量没什么区别,都是同一个单词 literals 的不一样翻译而已,因此直接量也就是字面量,字面量就是直接量,不一样书可能用的不一样翻译而已。数组
原始值
原始类型的值称为原始值,原始值是不可变的。在 JavaScript 中,有两种数据类型:原始类型和对象类型。浏览器
原始类型包括:数字(Number)、字符串(String)、布尔(Boolean)、null、undefined。
表达式&语句
表达式能够理解成方程式,用于计算某个结果值或某种行为的代码可称为表达式,一般它们并不会改变程序状态,也不会影响程序后续执行流程,如算术表达式: x+1。
语句表示一个完整的行为,能够是多个表达式与关键字、运算符等的组合。
函数&方法
function 关键字声明的称为函数,但将函数置于对象内时,此时称它为对象的方法。
简单的理解,从不一样的角度看待,若是是从函数自己,那么它就是个函数,若是是从对象角度看待,那么称某个函数是对象的方法,本质上没什么区别。但当调用时会有所区别。
另外,函数本质上也是一个对象。
构造函数
JavaScript 没有相似于 Java 的 class 机制,一个函数,当和 new 关键字一块儿使用时,此时称这个函数为构造函数。
也就是全部的函数均可以做为构造函数,当它和 new 关键字一块儿使用时,此时它的行为有区别于普通的函数调用。
全局对象
在前端里,当 js 的宿主是浏览器时,全局对象是 window。全局对象有几点特性:
- js 文件中不在函数内声明的全部变量和函数都是做为全局对象的属性存在。
- 全局对象的属性使用时,能够直接经过属性名访问,没必要添加前缀,也就是没必要像 window.name 这么使用。
- js 文件中,函数外出现的 this 都指向全局对象 window。
全局属性
全局对象的属性就称全局属性,但这里的全局属性,更多的是在表示这种场景下为全局对象建立的属性:
<script type="text/javascript"> weixin = dasuAndroidTv; </script>
当咱们在函数外部直接对一个不存在的变量赋值操做时,此时等价于执行 this.weixin = dasuAndroidTv
,而 this 指向全局对象,因此会自动为全局对象添加一个属性,属性名为 weixin。
因此,有时候,全局属性是特指这种场景下为全局对象建立的属性。之因此会用全局属性来称呼这种场景,是为了跟下面的全局变量和全局函数区分开。
全局变量
<script type="text/javascript"> var weixin = dasuAndroidTv; </script>
像这种不在函数内声明的变量,称为全局变量。虽然,它们最终也都是做为全局对象 window 的属性而存在,但因为这种方式为 window 建立的属性和上述介绍的不加 var 关键字为全局对象添加属性的方式有本质上的区别。
因此,为了和上述介绍的全局属性概念区别开来,一般称这种经过 var 为全局对象建立的属性为全局变量。
既然全局对象的属性在任何地方均可以不加前缀的直接访问使用,因此全局变量在任何地方均可以被使用。
对于上述介绍的那种直接对不存在的属性进行赋值操做行为而建立的全局属性,是可经过 delete 动态删除的;
而经过 var 或 function 这种声明全局变量的方式为全局对象建立的属性,是不可经过 delete 删除的。
全局函数
<script type="text/javascript"> function add() {} </script>
像这种不在函数内声明的函数,称为全局函数。它跟全局变量的特性、用意如出一辙,区别只在于一个是变量、一个是函数而言。
包装对象
原始类型所对应的对象类型,相似于 Java 中的包装类。
由于原始类型不是对象,不可操做方法和属性,但可将其转换为对应的对象类型,此时称为包装对象,便可像操做对象同样操做这些转成包装对象的原始类型数据。
包装对象有:Number, Boolean, String
原型
因为在 JavaScript 中,除了原始类型,其他的皆为对象,因此它的继承双方只能都是对象,也就是说,对象也是继承自对象的,那么做为父类角色,做为被继承的那个对象,此时称它为原型。
因此,才说 JavaScript 是基于原型的继承语言。
原型就是相似于 Java 中父类的概念。
原型链
既然涉及继承,那么天然就有继承结构,这个结构在 JavaScript 中就称为原型链。
好比对象 a 继承自对象 b,对象 b 继承自对象 c,那么 a 的原型链就表示为:a -> b -> c(省略掉内置的继承关系)。
原型链用于当操做对象某个属性时,寻找该属性的来源。
做用域
做用域指的是变量和函数的做用域,下面统称变量,在 JavaScript 中,变量分两种:全局变量和局部变量。
全局变量指的是在函数外定义的变量,做用域是全局,在任何地方均可以使用,即便跨 js 文件中也可使用,由于它们其实是做为全局对象的属性存在,在前端里就是做为 window 的属性,而多个 <script> 中的不一样 js 文件,都是共用同一个全局对象 window,天然就能够跨文件使用它的属性。
局部变量指函数内部定义的变量,或者函数形参,做用域为函数内。须要区别于 Java 中的局部变量,Java 里的局部变量的做用域为块级做用域:只能在局部变量声明的代码块且声明位置以后使用;但在 JavaScript 中,变量都有声明提早的特性,局部变量在函数内无论哪里均可以访问,即便声明的位置在末尾,或内嵌的代码块中。
做用域链
在 JavaScript 中,容许在函数内部继续定义函数,因此函数能够存在很深的嵌套层次,这里的嵌套层次不是指调用的嵌套,而是指函数声明的嵌套,A 函数在 B 函数中定义,做为 B 函数的局部变量存在这种。
而内部函数是能够访问外部函数内的变量的,也能够访问全局的变量,那么当内部函数使用了某个外部变量,就会借助做用域链,沿着做用域链中寻找这个外部变量到底是外部函数内的变量,仍是全局变量。
从原理上解释,每一个函数调用时,都会建立一个函数执行上下文,执行上下文中存储着当前上下文中的全部变量,做用域链,就是将具备嵌套层次的函数的上下文中的变量串接起来的存在。
仍是要反复强调,上面的嵌套层次指的不是函数调用时的嵌套层次,而是函数定义时的嵌套层次。能够将这里有嵌套层次关系的函数理解成 Java 中的内部类。
闭包
MDN 中的文章对其的解释为:闭包是函数和声明该函数的词法环境的组合,这个环境包含了这个闭包建立时所能访问的全部局部变量。
某篇文章中看到过这么一种解释:闭包是代码块和建立该代码块的上下文中数据的结合。
闭包的概念不怎么好理解,有的文章里会说,函数就是闭包,有的说内嵌的函数是闭包,这里先不作评价,先尝试着从上面两种解释中去理解一下,看可否理解,后续会专门写一篇来说讲。
你们好,我是 dasu,欢迎关注个人公众号(dasuAndroidTv),公众号中有个人联系方式,欢迎有事没事来唠嗑一下,若是你以为本篇内容有帮助到你,能够转载但记得要关注,要标明原文哦,谢谢支持~
原文出处:https://www.cnblogs.com/dasusu/p/10048550.html