JavaScript 的无法避免的缺点

JavaScript 的缺点和 Py的缺点一样多。然而由于JS的普及度高,且坚持兼容性,使得它依然是一门强大的动态、弱类型语言。虽然JS缺点不少,但是我们还是要了解他的不足,今后跳过这些坑,写出能媲美Java一样的优秀代码。

本章讨论,在js代码里无法通过自己努力避免的缺点。下一章讨论,可以通过自己努力回避的缺点。

缺点一:全局变量

辣鸡的全局变量,是js的最大缺陷。全局变量,是在所有作用域中都可见的变量。

全局变量在,简单的业务逻辑的代码里可以带来方便,但随着业务逻辑复杂化,它们很快不可控制。这一点和辣鸡的Py相似,只能做简单的事情,复杂的事情会事倍功半。

原因:因为可以在代码中任意位置、任意时间,修改全局变量,这使得程序的行为变得复杂不堪,降低了程序的可靠性。

全局变量使得在同一个程序中运行独立子程序,变得繁琐。如果某些全局变量的名称碰巧和子程序中的名称相同,那么它们将会互相冲突,可能导致程序无法运行,而且通常难以调试。

有三种方法可以定义全局变量:

1. 在任何函数之外放置一个var语句,这时该函数自动变成全局变量

var foo = value;

2. 直接给全局对象添加一个属性。全局对象是所有全局变量的容器。

其实所谓的全局对象,就是我们熟知的对象名为window的对象。

window.foo = value;

3. 直接使用未经声明的变量,这时隐式的全局变量:

foo = value;

大家要注意这一点,这种方式本意是有意让变量在使用前无须声明,来给方便人们使用。然而,很多人忘记声明变量是导致错误。java语言的解决方案是编译器直接报错,然而辣鸡的js的解决策略是让忘记声明的变量成为全局变量,但这样导致查找bug十分困难!!!

在许多编程语言里都有全局变量,尽管他们的实现方式和特性不同。例如java中的public static 成员变量就是全局变量,以静态方式封装特定类里,做好了全局变量的隔离性。然而垃圾js语言,没有import,因此所有的编译单元都载入一个公共全局对象中。结果就是导致了,缺少隔离性,js全局变量可以在哦任何时候任何地点被程序代码修改,复杂度上升。

缺点二:作用域

js没有提供块级作用域

js的语法来源自C。在所有其他C风格的语言里,一个代码块会创造一个作用域,也就是我们所说的块级作用域。但是,js采用了这样的块语法,但是却没有提供块级作用域:代码块中声明的变量在包含此代码块的函数的任何位置都是可见的。这种特性和99%的编程语言都不同,是个辣鸡的特性。

在大多数语言中,声明变量的最好的地方是在第一次用到它的地方。但这种做法在JS里反而是一个坏习惯,因为它没有块级作用域。更好地方法是在每个函数的开头部分声明所有变量。

缺点三:自动插入分号

JS有一个很鸡肋的功能,它可以自动插入分号,来修正有缺陷的程序。但是,不要过于相信他,导致出现更为严重的错误。

有时它会不合时宜地插入分号。例如,在return语句中自动插入分号导致的后果。如果一个return语句返回一个值,这个值表达式的开始部分必须和return位于同一行:

return
{
    status: true
};

看似要返回一个包含status成员元素的对象。遗憾的是,自动插入分号让它变成了返回undefined

自动插入分号导致程序被误解,却没有任何提示信息。如果把{放在上一行而不是下一行的头部就可以避免该问题:

return{
    status: true
};

缺点四:保留字

有很多单词在JS里面被保留,但是其中有一些单词中的大多数并没有在语言中使用。它们不能被用来命名变量或参数。

这些保留字不能用来命名变量或参数。

当保留字被用作对象字面量的键值时,它们必须被引号括起来。它们不能被用在点表示法中,所以有时必须使用括号表示法:

var method;  // ok
var class;   // 非法
object = {box: value}; //ok
object = {case: value}; //非法
object = {'case': value}; //ok
object.box = value;    //ok
object.case = value;   //非法
object['case'] = value; //ok

 

 

转载于:https://my.oschina.net/u/3286366/blog/1575720

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值