前言数组
坦白说对于Javascript所谓的严格模式在今年早些时候我还一无所知,真正在开发中应用也就几个月.对于这个ECMAScript5就已经引入的东西,已经不能算新了,对于这个东西一直处在字面的理解上,就是"更加严格,规范的限制Javscript代码的书写",今天打算结合使用的经验好好研究下它究竟是怎么回事.浏览器
正文函数
Javascript中若是你想你的代码在严格模式下运行,很是简单,只要在代码的第一行,也就是首行加上"use strict"指令便可.对于那些不支持ECMAScript5的浏览器来讲它没有任何影响,因此若是想它生效要肯定一下你的浏览器,不是全部浏览器都支持,毕竟咱们给力的国情决定IE仍是市场主力,IE10一下的同窗要注意了.
this
使用"use strict"能给开发带来什么好处?
编码
其实若是你一直在Chrome环境下开发,而且代码书写算规范,那么你几乎不会感受到有任何变化.可是确实有一些显而易见的好处,我也从中受益因此和你们分享一下.
spa
(1) 错误提示更加准确
code
Javascript的错误提示一直是个比较伤心的问题,松散的语言结构在赋予格外灵活的同时也让他像调皮的孩子同样难以管教.在Javascript应用愈来愈重的今天,这会明显拖延咱们的开发进度,影响开发的感受.
对象
"use strict"模式下能够更加明确的提示你的代码出了什么样的错误,这让你能够更加快速而且专一的去解决问题.
ip
(2) 变量必须声明
作用域
在非严格模式若是你没有声明一个变量就使用它,那么它会被当作一个全局变量,在严格模式下则报错并抛出异常.我一直认为先声明后使用是一个好习惯,而且一直坚持.
(3) 属性或者参数再也不可重复
虽然没有写过,不过我确实看过相似的代码:
var a = { aaa: 'dddddd', bbb: 'dddddd', aaa: 'cccccc' }
虽然不算是惊呆了,不过我就想问,哥们你是从CSS转到JS的吗...属性覆盖都来了.在非严格模式下这样书写可能不会报错,若是你用"use strict"那么抱歉,浏览器会抛出异常.
(4) with被禁用
这个虽然是一个重要的改变,至关于API层次的禁用,不过貌似平常编码中咱们使用with的时候并很少,因此影响不大
(5) Function中this再也不是window
这一点算是严格模式下的一个很严谨的地方,常常在调用的函数中咱们用this指向window这类全局变量.可是在严格模式下,这样的this的值是undefined.
(6) 变量删除
相比较与属性删除咱们可能不多或者几乎不会去进行变量删除的操做,在严格模式下变量的删除是不容许的.而对于属性的删除,只有configurable设为true的属性才能被删除.
"use strict"; var x; delete x; // 语法错误 var o = Object.create(null, 'x', { value: 1, configurable: true }); delete o.x; // 删除成功
(7) 函数声明只能在顶层
这个改变很是可能对旧有的代码或者本来书写就不规范的代码形成影响,之前咱们定义function能够说是为所欲为,无论在if仍是for中,都是想怎么样就怎么样.
在"use strict"模式下,为了与之后ECMAScript6接轨,规定了函数的声明只能在全局做用域或者函数做用域的顶层进行声明.
(8) arguments对象再也不神奇
在严格模式中,函数里的arguments对象拥有传入函数值的静态副本.而在非严格模式下,arguments对象的数组元素和函数参数都指向同一个值的引用.这种限制会使得不少神奇的代码再也不可用.
结论:
上面这几点是我感受使用了"use strict"后变化最大的地方,另外须要注意"use strict"的使用也是有风险的,并非万金油.尤为是在旧有的项目中,若是想使用严格模式要很是谨慎,一旦你在文件首行加入了"use strict"那么整个文件都会受到这个限制,若是你合并全部文件,这一点要格外注意.
固然你也能够灵活的使用"use strict",好比在函数内部的首行,或者在匿名函数做用域的首行去使用.注意这里之因此强调是首行,由于浏览器对于脚本代码以及函数体中第一条常规语句后的内容都不会看成指令去解析,也就是说若是你的"use strict"写在了var a=0;以后,那么浏览器只会将其看成一个普通的表达式语句.
最后,但愿你们在开发时条件容许的状况下尽可能使用"use strict"开发,它最大的好处就是帮助你更快的定位错误!详细的提示信息让你更好的纠错.