当前位置: 首页 > 科技观察

JavaScript 代码加不加分号有什么区别

时间:2023-03-16 21:24:11 科技观察

在JavaScript代码中添加分号有什么区别?关键是理解分号对JavaScript的影响。在开始之前,可以先看看这个面试题:这段代码能不能正常运行?vara=1(函数(){console.log(2)})()。....如果运行这段代码,会出现如下错误:UncaughtTypeError:1isnotafunctionwhatthehell!1不是函数?我们并没有打算运行数字1,为什么数字1不是函数呢?这种错误很难找到原因,经常绕着有问题的代码行旋转。这个错误一定是上面的?代码在运行时看是同一行,其概念如下:vara=1(function(){/**/})()所以立即数函数的()被追加到1,这是一个调用函数的语法,所以会产生错误1??isnotafunction。为了避免这个错误,需要使用分号:vara=1//分号放哪里都行,能隔开即可;(function(){console.log(2)})()ASI自动添加semicolonsASI是“AutomaticSemicolonInsertion”的缩写,它会在运行时自动将分号插入到一些换行的代码中。这种机制可以让一些代码在不加分号的情况下也能正常运行,比如下面这个例子:varb=1++bconsole.log('b',b)由于代码中的++是一元表达式,所以可以只能用在表达式Placevariablesontheleftorright,如果没有ASI机制,代码会变成varb=1++b这样的错误语句。好在有ASI,实际运行时会自动加分号,所以不会出现上面的错误。varb=1;++b;console.log('b',b);//2return和分号的关系再看一个例子,下面的代码在return后的一个空行后面写上要返回的值,那么运行结果是什么?functionfn(){return'Xiaoming'}console.log(fn())这段程序代码经过ASI修改,return后会加一个分号,所以return和期望的return值是分开的,并且结果返回的内容为空,最终结果只能是undefined。functionfn(){return;'小明';}console.log(fn());//undefined如何处理分号?本来ASI是出于好意对没有加分号的代码片段进行修正,但是偏偏在某些地方没有发挥它的作用(比如本文开头介绍的立即数函数),导致出错在代码中;甚至有些代码不会出错,但会让你的代码执行结果与预期相差万里。解决ASI问题的方法如下:无论如何,分号都要加,代码的划分完全由你决定。请记住不会自动添加分号的规则。当没有自动插入分号时,手动添加不会自动添加。分号规则以下是各种不自动加分号的规则:1.换行代码以(,[,/字符开头,这种情况下会直接出现UncaughtTypeError,代码无法运行。vara=1varb=a(a+b).toString()vara=1[1,2,3].forEach(bar)(function(){})()(function(){})()vara=1varb=a/测试/.test(b)2.以+、-、*、%开头的行,这些情况大多会影响运算结果,所以应该合并成一行。vara=2varb=a+a3。新行以,or.一开始经常出现这种用法,主要是为了防止代码太长,这种分隔不会影响操作,而且用得好的话会让代码更易读。vara=2varb=a.toString()console.log(typeofb)vara=1,b=2//b也会被var声明如果需要加分号,除了在末尾加分号语句,也可以在“不会自动添加分号”前面加一个分号。例如,()本身不会自动添加分号。当有这样的需求时,可以添加;到前面(ESLintStandardJS规范使用这种方法来避免错误)。//运行错误(function(){})()(function(){})()//正确;(function(){})();(function(){})()总结有人认为不是加分号可以让代码看起来更干净、更精简,而且大多数情况下不会出错,所以很多人在敲代码的时候不会加分号。不过,我倾向于更严格的规范,也许是因为我已经从后端转到前端并且我已经习惯了。至于如何选择,只要明白操作的局限性,无论哪种款式都很好,只要自己喜欢就好。