js return加分号_js分号的重要性
js中语句末尾可以不加分号,
很多时候在做练习或写几个页面时,我都是不会加的。虽然知道加了会好一点。但就是觉得很敲一句就要多按一次分号键(;)来加分号,而不加也不怎么样,然后就不想加了。
也听说在对js压缩于,会自动给语句加分号。
只是呢,从没认真考虑过如果分号会给js带来错误?什么情况下会导致错误?
——看了《走进javascript——不起眼的基础,值和分号》http://www.cnblogs.com/pssp/p/5215417.html 一文,我决定都给我的js语句加上分号。
难道是不加分号对js的影响很大?不,是我不加分号连什么情况下会导致错误都不知道,还偷什么懒?这不是在造坑?
先总结一下,像很多插件的js的首句前面都会有个;分号,是用来避免当如果合并如下js文件如以下情况时,解释器可能会出错。
//代码块A
var a = 10;
var b = 5;
var c = a + b
//代码块B
('x' + 'y').toString()
在 ('x' + 'y').toString() 前面加上分号就好了。
//代码块A
var a = 10;
var b = 5;
var c = a + b
//代码块B
;('x' + 'y').toString()
所以,分号是一件多么重要的事情。
另外,我想自己写的一些js文件放到一些工具里去注释或压缩,就不能好好的运行了呢?分号?特殊语句?
如果我好好的写分号,可能就不会纠结是分号问题还是遇到特殊的语句问题了。
值
有时我很想知道javascript解析引擎是如何区分一个变量的值,比如下面这段代码。
var x = 'javascript'; //javascript
x = "hello"; // hello
x = 555; //555
x = null; //null
x = a; //a is not defined
x = true; //true
对于数字是直接赋值的,因为它没有多样性,数字就是数字。但是对于值是英文的情况就很难区分了,因为在编程语言中,英文既可能是字符串,也可能是引用的另外一个变量。因此如何区分变量和字符串就显得格外重要,编程语言常常将字符串用引号括起来,从而达到区分变量和字符串的作用。有些语言比如java,它们还区分单引号和双引号,单引号括起来的是一个字符,而双引号括起来的才是字符串。但javascript并不区分字符和字符串,而是把它们都当作字符串,因此在javascript中单引号和双引号并没有什么区别。
虽然通过引号可以用来区分变量和字符串,但值往往也可能是一个关键字,比如上面那段代码我将x赋值为null,那么这些编程语言又是如何区分变量和关键字的呢?
null = 123;
console.log(null); //Uncaught ReferenceError: Invalid left-hand side in assignment
undefined = 456;
console.log(undefined); //undefined
以上我给null和undefined分别赋给了另外一个值,其结果,给null赋值报错了,给undefined赋值虽然没有报错,但也没有成功。也许对于null和undefined来说,它们就是值。而变量则是寻找值。我们说javascript是如何区分变量和关键字,最终或许就变成了javascript是如何区分变量和值的。
分号
在一些JS插件中,经常会看到类似下面这样的一行代码
;(function(){
.........
})();
在代码的最前面有一个分号,那么这个分号是干什么用的呢?
我们知道一个分号代表了一段代码的结束,但问题是javascript允许你不写分号,这样就出现了一个问题,代码的结束与否不是你来决定的而是由程序来决定的,而程序也不是万能的,往往它只是走的某个规则,而如果你写的这段代码和它的规则不符,最终的结果就有些不如人意了。
以下是javascript对省略分号的解析规则
var a
=
1 + 2
console.log(a) //3
javascript解析器会将以上代码解析成
var a = 1 + 2;
console.log(a); //3
如果javascript不给2后面添加分号将会无法解析下去,也可以这么说,如果遇到无法解析下去则javascript解析器会尝试给其添加一个分号,如果还是解析不了则报错。又比如下面这一段代码
var a = 10;
var b = 5;
var c = a + b
(a + b).toString()
// b is not a function
它说b不是一个函数,也就是说以上这段代码很有可能解析成了下面这段代码
var a = 10;
var b = 5;
var c = a + b(a + b).toString();
它把()当成了函数调用。也可以理解为javascript解析器会尽可能多的去匹配,但也有几个例外,它们是retrun、break、continue,当javascript解析器解析到这几个关键字时,它不会把换行后的内容当成是自身的,而是直接在换行之前添加分号,不妨看看下面这段代码
function test(){
return
123;
}
console.log(test()); //undefined
它并没有返回123,也就是说它直接在retrun后面加了分号。
再回过头来看看,那些插件开发者为什么要在代码第一行添加一个分号?
既然是插件,自然是给别人用的对吧,可关键问题是你也不清楚使用这个插件的人它的代码是如何编写的,这好像挺谬论的,它的代码和我们有什么关系呢。
如果说使用者的代码会影响我们的代码,那么它又是如何影响的呢?比如我们正在编写类似下面这样的一段代码
第一个脚本是使用者自己写的,第二个脚本是引入的某个插件,那么浏览器又是如何解析这两个脚本的呢?不妨我们来测试一下
test.js
var a
a
zmz.js
(1+2)
如果你运行起来会发现并没有报错,也就是说javascript解析器并不会因为前面这个文件没有加分号而和后一个文件中的代码一起解析。
问题倒不在这,而是有可能你刚刚看了一本关于HTTP的书,哇靠,原来把文件合并可以减少请求数,于是乎这两个脚本融为一体了。摇身一变成了下面这样
var a
a(1+2)
你说这能不出错吗,如果我们在插件的一开始就加上分号,这种事情就不可能出现。
var a
a;(1+2)
因此不要把分号单单认为只是用来结束某段代码,它还可以用来隔离某段代码和别人划清界限。
js return加分号_js分号的重要性相关推荐
- js return加分号_javascript每条语句该不该加分号(javascript分号详解)
javascript的分号代表语句的结束符,但由于javascript具有分号自动插入规则,所以它是一个十分容易让人模糊的东西,在一般情况下,一个换行就会产生一个分号,但实际情况却不然,也就是说在ja ...
- js return加分号_JavaScript语句后应该加分号么?
首先,加还是不加,这是一个书写风格问题.而书写风格通常有一些外在的考量,比如团队所建立的规则或习惯.@玉伯 的答案就是基于此.我对此基本赞同,不过这其实有点避重就轻,呵呵.另外,即使团队有这样的规则 ...
- js日期加横杆_js实现的将年月日用横线链接格式化代码
本章节介绍一下如何将一个时间对象格式化为年月日用横线连接的形式,因为这种形式是比较流行的一个格式,下面就通过代码实例介绍一下如何利用javascript实现此效果,代码如下:[JavaScript] ...
- js日期加减一天_JS日期加减,日期运算代码
这篇文章主要介绍了JS日期加减,日期运算代码,需要的朋友可以参考下 一.日期减去天数等于第二个日期 function cc(dd,dadd){ //可以加上错误处理 var a = new Date( ...
- js 延期执行_JS延迟加载(setTimeout) JS最后加载
为了让一个广告几秒以后再执行所以做个延迟加载的东东,用了JS实现,还蛮好用的,算是分享,也是记录吧. 第一 JS延迟加载 setTimeout("document.getElementByI ...
- JS动态加载脚本及对动态脚本内方法的调用
JS动态加载脚本及对动态脚本内方法的调用 摘要 JS动态加载脚本及对动态脚本内方法的调用 JS 动态 添加脚本 按需加载 首先我们需要一个被加载的js文件,我在一个固定文件夹下创建了一个package ...
- js css加载器,webpack的CSS加载器的使用
什么是loader loader用于转换应用程序的资源文件,他们是运行在nodejs下的函数,使用参数来获取一个资源的来源并且返回一个新的来源(资源的位置),例如:你可以使用loader来告诉webp ...
- 转:JS动态加载JS
JS动态加载JS 1.直接document.write <script language="javascript"> document.write("< ...
- js动态加载css文件和js文件的方法
今天研究了下js动态加载js文件和css文件的方法. 网上发现一个动态加载的方法.摘抄下来,方便自己以后使用 [code lang="html"] <html xmlns=& ...
- Js函数加括号、不加括号
Js函数加括号.不加括号 (function a(){}) (命名函数表达式)会返回这个函数(不会执行),但是在括号外面无法调用该函数,需要一个变量接收这个函数,var fun = (function ...
最新文章
- C++托管代码生成DLL
- tf.variable_scope和tf.name_scope的用法
- java 生成组织列表树(非递归)
- docker(iptables)目标地址转换,运行中的容器映射端口
- JAVA基础--final、static区别以及类加载顺序
- 如何恢复在 PyCharm 中误删的整个项目文件
- 基于jQuery鼠标点击弹出登陆框效果
- python真是最烂的语言_在大型项目上,Python 是个烂语言吗?
- Spring Data Jpa 报错org.hibernate.LazyInitializationException: could not initialize proxy
- 別人的心得。。。。。學習
- 现任明教教主 NAC Framework EOU 视频
- SDN的机遇与挑战 让宽带利用率与硬件不再是难题
- 教你怎样打领带(附图)绝对实用哦!!!【实用】
- PG数据库创建视图并授权给新用户
- mysql监控工具-PMM,让你更上一层楼(上)
- 嗅探服务器系统,嗅探服务器
- 罗格斯的计算机科学博士奖学金,罗格斯大学奖学金
- 简单创意的思维导图怎么画
- P5304旅行者(比bk201还要流氓的解法)
- 测试工程师的明天在哪里