梳理的内容以《JavaScript权威指南》这本书中的内容为主,因此接下去跟JavaScript语法相关的系列文章基本只介绍ES5标准规范的内容、ES6等这系列梳理完再单独来讲讲。
正文-相关术语
对于从Java或C++转过来的开发人员来说JavaScript会有点让人困惑,因为它全部都是动态的,都是运行时,而且不存在类机制。所有的都是实例对象。所以,学习一些JavaScript的语言特性时,最好不要试图从Java中寻找相关概念硬套过来,类比可以。
接下去一系列关于JavaScript语法的文章中,将会出现很多在Java里出现或者没出现过的专业术语,所以第一篇就先来罗列一下,每个术语先给一定的解释。
有的理解不了没关系,等这系列文章看完,再回过头来看这一张基本也都能理解了。先罗列出来,至少有个印象,不至于到时看到一脸懵逼。
直接量
可以直接使用的数据值,即在程序中直接出现的数据值,如:
"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。
全局属性
全局对象的属性就称全局属性,但这里的全局属性,更多的是在表示这种场景下为全局对象创建的属性:
当我们在函数外部直接对一个不存在的变量赋值操作时,此时等价于执行this.weixin = dasuAndroidTv,而this指向全局对象,所以会自动为全局对象添加一个属性,属性名为weixin。
所以,有时候,全局属性是特指这种场景下为全局对象创建的属性。之所以会用全局属性来称呼这种场景,是为了跟下面的全局变量和全局函数区分开。
全局变量
像这种不在函数内声明的变量,称为全局变量。虽然,它们最终也都是作为全局对象window的属性而存在,但由于这种方式为window创建的属性和上述介绍的不加var关键字为全局对象添加属性的方式有本质上的区别。
所以,为了和上述介绍的全局属性概念区别开来,通常称这种通过var为全局对象创建的属性为全局变量。
既然全局对象的属性在任何地方都可以不加前缀的直接访问使用,所以全局变量在任何地方都可以被使用。
对于上述介绍的那种直接对不存在的属性进行赋值操作行为而创建的全局属性,是可通过delete动态删除的;
而通过var或function这种声明全局变量的方式为全局对象创建的属性,是不可通过delete删除的。
全局函数
像这种不在函数内声明的函数,称为全局函数。它跟全局变量的特性、用意一模一样,区别只在于一个是变量、一个是函数而言。
包装对象
原始类型所对应的对象类型,类似于Java中的包装类。
因为原始类型不是对象,不可操作方法和属性,但可将其转换为对应的对象类型,此时称为包装对象,即可像操作对象一样操作这些转成包装对象的原始类型数据。
包装对象有:Number, Boolean, String
原型
由于在JavaScript中,除了原始类型,其余的皆为对象,所以它的继承双方只能都是对象,也就是说,对象也是继承自对象的,那么作为父类角色,作为被继承的那个对象,此时称它为原型。
所以,才说JavaScript是基于原型的继承语言。
原型就是类似于Java中父类的概念。
原型链
既然涉及继承,那么自然就有继承结构,这个结构在JavaScript中就称为原型链。
比如对象a继承自对象b,对象b继承自对象c,那么a的原型链就表示为:a -> b -> c(省略掉内置的继承关系)。
原型链用于当操作对象某个属性时,寻找该属性的来源。
作用区域
在 JavaScript 中,允许在函数内部继续定义函数,所以函数可以存在很深的嵌套层次,这里的嵌套层次不是指调用的嵌套,而是指函数声明的嵌套,A 函数在 B 函数中定义,作为 B 函数的局部变量存在这种。
而内部函数是可以访问外部函数内的变量的,也可以访问全局的变量,那么当内部函数使用了某个外部变量,就会借助作用域链,沿着作用域链中寻找这个外部变量究竟是外部函数内的变量,还是全局变量。
从原理上解释,每个函数调用时,都会创建一个函数执行上下文,执行上下文中存储着当前上下文中的所有变量,作用域链,就是将具有嵌套层次的函数的上下文中的变量串接起来的存在。
还是要反复强调,上面的嵌套层次指的不是函数调用时的嵌套层次,而是函数定义时的嵌套层次。可以将这里有嵌套层次关系的函数理解成 Java 中的内部类。
本系列文章内容全部梳理自以下几个来源:
《JavaScript权威指南》
MDN web docs
Github:smyhvae/web
Github:goddyZhao/Translation/JavaScript
本文来源于网络,版权归原作者所有(已有修改整合),如有侵权请联系我们,即刻处理。谢谢!