JS作用域(一):一般变量声明
变量声明是一门编程语言的重要组成部分 ,每门编程语言都有其声明变量的形式,今天来简单了解一下JS的变量声明方式。
与C语言的区别
在C语言中,如果我们需要使用一个变量,必须在使用前声明它,否则程序就会报错,同时我们也必须指定变量的类型,如int,float,char等等,因此根据这种特性,C语言也被划归于强类型语言。与此相反,弱类型语言的概念也应运而生,而JS便是其一。在JS中,我们使用变量前可以使用变量声明,方式有var,let和const(注意,在JS中使用变量前并不一定需要声明,后面会在另外的篇幅中介绍这种情况),同时,JS并不要求你指定变量的类型,并且如果你是用了var或者let去声明变量,那么变量的类型在程序执行过程中是随时可以改变的。这也是弱类型语言的一个特色,就是变量的使用十分的多变和灵活。
简单说几个例子
var a = 20 //声明了一个变量a,它的值为20 let b = 'abc' //声明了一个字符串b,他的值为'abc' const d = 30 //声明了变量d,值为30
var,let和const的具体区别在这一节中不会具体细说,因为其中涉及大量作用域的知识,在介绍完JS作用域的相关知识后会再进行详解。
一点点思考
前面说到JS是弱类型语言,这使得JS具有了很强的灵活性,一定程度上也减少了程序员的心智负担,但弱类型语言并非十全十美,在许多大型项目中,弱类型的特性给程序员带来的困扰远比便捷多。
变量类型频繁变更容易导致BUG
试想一下,一个变量a,开始他是一个Number类型,然后变成了字符串类型,如果后面a参与了某些运算,而如果你并没有准确了解此时变量a的具体类型,那么你的运算就可能会得到一些十分意外的结果(博主就曾深受其害),这时候你还得回头一行行查看代码,找出在哪改变了变量的类型。(注意,JS中不同类型的变量进行逻辑运算很多情况下不会发生报错,但却因为这样产生了无数BUG)。然鹅程序员是很聪明的,为了解决这个难题,注明的TS(TypeScript)诞生了,他很好的明确了变量的类型,而很多IDE根据这个特性给程序员提供了查询变量类型的便捷方法,使得项目的开发难度和可维护性大大降低了。
弱类型语言在底层限制了JS的性能
很多强类型语言最后都编译成了二进制代码,而二进制代码是电脑可以直接运行的,自然性能也最佳。然而因为JS的变量类型是不确定的,因而在转化成二进制代码以前,编译器必须对变量类型进行判断,所以JS并不能直接编译成二进制代码运行,而是要根据实际情况确定变量类型以后才进行编译工作,这就损失了很大一部分性能。对此,Chorome的V8引擎以及近年的Wasm(WebAssembly)标准都试图去解决JS的性能问题,但即便他们花费了很多功夫,目前JS相对于传统C语言等强类型语言的性能还是有较大差距。而Chrome甚至一度想用Dart语言来替代JS进行前端开发,不过他们低估了业界对JS的钟爱,因而后来不得不放弃了这种想法。也许在未来,JS的性能会更接近C,不过,永远也不可能超越C,甚至等于C。