1. 什么是严格模式?
严格模式是Javascript的一种工作模式,它可以让我们的代码更加安全、规范和高效。它是ES5中的新特性,在执行代码时开启严格模式只需要在代码前面添加 "use strict"; 声明,就可以在全局或局部作用域中启用该模式。
"use strict";
1.1 严格模式的特点
启用严格模式后,一些不规范的语法将不能使用,比如不能使用未声明的变量,不能为只读属性赋值等。这将对代码质量的提升和调试而言都是极其重要的。以下是严格模式的特点:
变量必须先声明再使用
禁止 this 指向全局对象
禁止使用with语句
禁止对只读属性赋值
函数必须声明在顶层或函数内
禁止在函数内部遮盖arguments变量
参数禁止重名
禁止删除变量
eval()中引入的变量将不会自动成为当前函数的变量
通过以上限制,严格模式可以使代码更加健壮、减少出错的可能性。
2. 为什么要使用严格模式?
2.1 提高代码质量
开启严格模式后,一些不规范的代码会被禁止,避免了因为失误而出现的错误。在多人开发时,如果大家都启用了严格模式,可以强制大家遵循良好的编码规范,减少bug产生的可能性。另外,严格模式还可以增加代码的运行速度。
2.2 安全性提高
严格模式可以帮助我们发现程序中隐藏的因素和不安全的操作,并解决这些问题,大大降低了JavaScript代码被黑客攻击的可能性。例如使用eval会给黑客留下入侵的大门。但是在严格模式下,eval会无法对同时存在于上下文和局部作用域中的元素进行隐晦调用,从而避免了eval在代码注入中的危险行为。同时,几乎会避免使用不安全的JavaScript特性,使我们的JavaScript代码更加安全。
2.3 代码诊断和调试更容易
开启严格模式后,无法访问未声明的变量,这可以帮助我们减少因变量名错误而导致的bug。在函数调用中,参数必须按规则传递,这可以限制一些奇怪的和不安全的传递方式。一旦发生错误,严格模式可以帮助我们更快捷地进行诊断和调试,定位到问题所在。在代码组织和维护方面也有很大的帮助。
3. 怎么使用严格模式?
3.1 启用全局严格模式
要在全局作用域下启用严格模式,只需要在JavaScript文件或<script>
标签的顶部添加"use strict";声明即可。
"use strict";
3.2 启用局部严格模式
如果需要在一个特定的函数中启用严格模式,也有相应的方法。只需要在函数的开头添加"use strict";声明即可。
function strictMode(){ "use strict"; // you can use strict mode in this function}
4. 严格模式的扩展内容
4.1 禁用arguments.caller和arguments.callee
在严格模式下,默认禁用了arguments.caller 和arguments.callee。在Javascript函数中,可以使用这两个东西来访问调用该函数和该函数自身的引用。但是,这两个东西带来了很大的性能问题,并且可以让代码变得更难以调试。所以在严格模式下,这两个引用都被禁用了。
function caller() { "use strict"; console.log(arguments.caller); console.log(arguments.callee);}
4.2 禁止给只读属性赋值
在严格模式下,禁止给只读属性赋值。对于只读属性,是不能修改的,这也是为了保证代码的运行安全性。
"use strict";var obj = {};Object.defineProperty(obj, "readOnly", { value : 10, writable : false});obj.readOnly = 123; //error
4.3 禁止使用void操作符
在严格模式下,禁止使用void操作符。void是JavaScript中一个非常奇怪的操作符,它会对任何一个表达式进行求值,然后返回一个undefined值。当一个程序员在代码中使用void操作符时,通常是为了防止代码被重写。但是它的使用和理解都非常困难,容易出问题。因此在严格模式下禁止。
"use strict";console.log(void 0); // undefinedconsole.log(void(0)); // undefinedconsole.log(void(1+2)); // undefined
5. 结语
严格模式可以使我们写出更加健壮和规范的JavaScript代码。它提供了一种新的安全和可控的编程方式,可以实现代码质量提高、安全性提高、调试和诊断更容易的目的。因此,在深入学习JavaScript编程的时候,建议多多学习严格模式的相关内容,并灵活使用它。