拥抱JavaScript严格模式

发布时间:2019-02-22 作者:一点通


掌握多门语言的同学可能会发现,在写JavaScript代码的时候明显要比其他语言更自由,很多时候本应该报错的地方却被睁一眼闭一眼的JS解析器放过了,对开发者来说,这种自由看似是一件好事,但是很多时候却隐藏了未知的隐患。

我们称这种开发模式为稀松模式/懒散模式(sloppy)模式。为了给这种自由散漫一种约束,出现了第二种开发模式,也就是今天我们的主角:**严格模式。说白了就是在这种模式下,就不能那么肆意妄为了,需要遵循一定的规则。

有什么用?

1、严格模式通过抛出错误来消除了一些原有静默错误。非严格模式下,某些代码会执行失败,但是不会报错,我们称之为静默失败,然而到了严格模式下却会果断给出报错。这样有利于我们明确错误,及时修正

2、严格模式修复了一些导致JavaScript引擎难以执行优化的缺陷。某些情况下,相同的代码,严格模式可以比非严格模式下运行得更快。

3、严格模式禁用了在ECMAScript的未来版本中可能会定义的一些语法,比如一些保留的关键字从现在开始就不能再用了。

4、严格模式下更容易写出“安全”的JavaScript。

用法

要切换为严格模式其实很简单,只需要"use strict"申明即可,开启的范围有下面两处:

1、为整个JS文件开启严格模式,将"use strict"放到脚本文件的第一行。

"use strict";
var a = 1;

注意这里可能会有坑,很多网站会合并JS文件,如果合并严格模式和非严格模式的脚本,就可能会出现问题。这种情况下建议采用下面的为函数开启严格模式,确保不会相互间影响。

2、为函数开启严格模式,将"use strict"放到函数体的第一行。

function strict(){
	'use strict';
	console.log('')
}

和非严格模式的区别

下面我们来看看和非严格模式相比,在严格模式下有哪些限制。

1、变量必须先声明后再使用,否则报错。

a = 1

2、函数不能有相同的形参名,否则报错。

function say(a, a, b){
	
}

3、不能使用with语句,否则报错。

4、不能为只读属性赋值(前面我们讲过defineProperty配置的只读属性不能成功赋值,但是不会报错)否则报错。

var obj = {}
Object.defineProperty(obj, 'name', {
	value: 42,
	writable: false
});
obj.name = 9

5、不能使用八进制语法,否则报错。

6、不能删除不可删除的属性,否则报错。

delete Object.prototype

7、使用delete删除一个变量名(而不是属性名)报错。

var obj = {}
delete obj

8、eval不会给外层作用域引入新的变量。

9、使用evalarguments作为变量名或函数名会报错。

10、arguments不会自动反映函数参数的变化。

11、不能使用arguments.calleearguments.caller

12、不能使用fn.callerfn.arguments获取函数调用的堆栈。

13、使用未来保留字(比如protectedstaticinterface)作为变量名或函数名会报错。

14、在语句块中使用函数声明会报错。

if(a < b){
	function f(){

}
}

15、对象出现两个相同的属性名会报错。

var a = {
	name: 'tom',
	age: 12,
	name: 'harry'
}

16、禁止this关键字指向全局对象。

目前IE10+的浏览器支持严格模式,在兼容性允许的范围内,我们推荐使用严格模式进行开发,但是切记要谨慎使用。