养成一个好习惯:在严格模式下开发Javascript

前言

坦白说对于Javascript所谓的严格模式在今年早些时候我还一无所知,真正在开发中应用也就几个月.对于这个ECMAScript5就已经引入的东西,已经不能算新了,对于这个东西一直处在字面的理解上,就是"更加严格,规范的限制Javscript代码的书写",今天打算结合使用的经验好好研究下它到底是怎么回事.

正文

Javascript中如果你想你的代码在严格模式下运行,非常简单,只要在代码的第一行,也就是首行加上"use strict"指令即可.对于那些不支持ECMAScript5的浏览器来说它没有任何影响,所以如果想它生效要确定一下你的浏览器,不是所有浏览器都支持,毕竟我们给力的国情决定IE还是市场主力,IE10一下的同学要注意了.

使用"use strict"能给开发带来什么好处?

其实如果你一直在Chrome环境下开发,并且代码书写算规范,那么你几乎不会感觉到有任何变化.但是确实有一些显而易见的好处,我也从中受益所以和大家分享一下.

(1) 错误提示更加准确

Javascript的错误提示一直是个比较伤心的问题,松散的语言结构在赋予格外灵活的同时也让他像调皮的孩子一样难以管教.在Javascript应用越来越重的今天,这会明显拖延我们的开发进度,影响开发的感觉.

"use strict"模式下可以更加明确的提示你的代码出了什么样的错误,这让你可以更加快速并且专注的去解决问题.

(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"开发,它最大的好处就是帮助你更快的定位错误!详细的提示信息让你更好的纠错.
时间: 2024-11-28 20:22:41

养成一个好习惯:在严格模式下开发Javascript的相关文章

SQL Server误区:在SQL Server 2000兼容模式下不能使用DMV

误区 #13.在SQL Server 2000兼容模式下不能使用DMV 错误 对于兼容模式已经存在了很多误解.80的兼容模式的数据库是否意味着能够附加或恢复到SQL Server 2000数据库?当然不是.这只是意味着一些T-SQL的语法,查询计划的行为以及一些其它方面和SQL Server 2000中行为一样(当然,如果你设置成90兼容模式则和SQL Server 2005中一样). 在SQL Server 2008中,你可以使用ALTER DATABASE SET COMPATIBILITY

SQL Server误区30日谈 第13天 在SQL Server 2000兼容模式下不能使用DMV_MsSql

误区 #13.在SQL Server 2000兼容模式下不能使用DMV 错误       对于兼容模式已经存在了很多误解.80的兼容模式的数据库是否意味着能够附加或恢复到SQL Server 2000数据库?当然不是.这只是意味着一些T-SQL的语法,查询计划的行为以及一些其它方面和SQL Server 2000中行为一样(当然,如果你设置成90兼容模式则和SQL Server 2005中一样).     在SQL Server 2008中,你可以使用ALTER DATABASE SET COM

SQL Server误区30日谈 第13天 在SQL Server 2000兼容模式下不能使用DMV

误区 #13.在SQL Server 2000兼容模式下不能使用DMV 错误 对于兼容模式已经存在了很多误解.80的兼容模式的数据库是否意味着能够附加或恢复到SQL Server 2000数据库?当然不是.这只是意味着一些T-SQL的语法,查询计划的行为以及一些其它方面和SQL Server 2000中行为一样(当然,如果你设置成90兼容模式则和SQL Server 2005中一样). 在SQL Server 2008中,你可以使用ALTER DATABASE SET COMPATIBILITY

一个名为O2O的模式出现了O2O解释为将线下商务的机会与互联网结合在一起

当不少人都认为传统百货店即将迎来冬天之际,一个名为O2O(Online To Offline的)的模式出现了O2O解释为"将线下商务的机会与互联网结合在一起,让互联网成为线下交易的平台".其实它正是线下线上联动双赢的一种体现. 过去,传统百货核心就是地段,地段好的客流量就高,但是现在问题就在于电子商务把商品数字化后,地理优势已经不再是重点了,最大的优势其实是心理捷径,而O2O正是满足一条件的最佳模式. 王府井O2O战略的第一步与微信合作 国内传统零售龙头王府井转变了观念,与腾讯签订战略

关于叶老师一个RR模式下UPDATE锁范围扩大案例的研究

原创转载请注明出处有误请指出 一.前言 叶金荣老师分享了一篇文章如下:https://mp.weixin.qq.com/s/09DJCyMq8kBn4mlezgzUgg 这里只研究下锁的模式,借用叶老师的表和语句 mysql> select * from t1; +----+----+----+----+ | c1 | c2 | c3 | c4 | +----+----+----+----+ | 0 | 0 | 0 | 0 | | 1 | 1 | 1 | 0 | | 3 | 3 | 3 | 0

Oracle的Archive Log模式下的恢复工作

oracle|恢复     学习并测试了一下Oracle数据库在开启Archive Log模式下的恢复. 系统是Win2K Server+Oracle 8.1.7. 参考了Chinaunix.net和ITPub.com网站相关资料.在此感谢给我的帮助. 注意,养成一个好的习惯非常重要.在开始恢复之前,以及恢复完成后,都要做一个系统全备份. 首先,要开启Archive Log归档日志模式 1. 关闭数据库 2. 修改initSID.ora文件.这个文件通常在$ORACLE_HOME/admin/$

ARC模式下的循环引用引起内存泄漏

自从iOS 5时代自动引用计数(Automatic Reference Counting)技术发布,Cocoa工程师们才扔下了内存管理的包袱,从此在Objective-C修行道路上的一座大山被削平.然而,即使ARC很强大,我们日常搬砖时同样是有内存泄漏风险的,今天我就跟大家聊聊这些你可能还没有注意到的坑. 测试原理 我们知道ARC模式下,NSObject的MRC相关方法都不可以使用了,但dealloc方法如果实现了,同样还是会调用的,只是不允许在dealloc方法中调用[super deallo

苹果桌面分类框在“开锁模式”下能做什么?

  1.我们可以根据自己的使用习惯对分类进行拖拽. 首先要确定该分类是否锁定,只有在开锁状态下我们才能对分类框进行拖拽,点击按钮可切换其状态: 2.确认"开锁"后,将鼠标放至分类框上方位置,可见一个十字光标,按住不放,即可将分类框拖动到其他位置. 3.其次,在开锁模式下我们还可以调整分类框的大小.具体操作方法与调整图片大小的方法一样,将鼠标放在分类框的四角处即可调整分类大小. 4.位置和大小调整好之后,将其锁定,便无法拖动和调整大小了.如需操作,再次"开锁"即可.

数据科学家 / 统计学家应该养成哪些好习惯?

做过一点统计模型,做过一点数据分析,现在工作名字叫数据科学家,厚着脸皮抛砖引玉,聊聊数据分析中需要养成的良好习惯. 1. 了解数据分析的目的/需求 做数据分析的新人可能都遇到过,辛辛苦苦花了几个小时做出来的结果,跟客户 / 合作伙伴 / PM / 老板要的不是一个东西,运气好的话回去修补一下,花个半小时之类的,运气不好的话直接推倒重来,搞不好又得晚上加班了. 比如说下午六点,正准备收拾东西回家,PM 跟你说想看知乎用户的活跃度,跟数据分析师提出需求说,我们来看看大家使用时长吧.那么问题来了,是看