在阅读jQuery源码的时候,发现jQuery用到的是’use strict’严格模式。因此就去查阅了一些资料来补充自己对严格模式的认识。下面是参考【javascript高级程序设计(第三版)】的内容。
1.严格模式(strict mode)
1.1 什么是严格模式
‘严格模式’最早引入是ECMAScript5。通过严格模式,可以在函数内部选择进行较为严格的全局或局部的错误条件检测。
【补充】ECMAScript各版本的划分,推荐:阮一峰老师中ECMAScript的历史介绍
1.2 使用严格模式的好处
可以提早知道代码中存在的错误,及早捕获一些可能导致编程错误的ECMAScript行为。
1.3 支持严格模式的浏览器
理解严格模式的规则非常重要,支持严格模式的浏览器有
- IE 10+
- Firefox 4+
- Safari 5.1+
- Chrome
2. 如何使用严格模式
当我们想要让自己编写的代码处在严格模式的时候,可以使用严格模式的编译指示(pragma),也就是一个不会赋给任何变量的字符串:'use strict'
。这就话需要放在想要处于严格模式的首句。
这种语法可以向后兼容那些不支持严格模式的javascript引擎。
- 支持严格模式的引擎会启动这种模式
- 不支持该模式的引擎就当遇到一个未赋值的字符串字面量,会忽略这个编译指示
如果在全局作用域中给出的这个编译指示,则整个脚本都将使用严格模式。也就是这个编译指示放在哪里,只要有javascript代码,就会让其处于严格模式。
在函数中使用严格模式。把’use strict’放在首位,就可以对整个函数其作用
function fn(){
'use strict'
//要实现的代码
}
【补充】字面量:
百度百科的解释
通俗理解:let a = 1;
这个等号左边的叫做变量,等号右边的就叫做字面量
3. 页面中使用严格模式与不使用严格模式的区别
3.1 变量
在严格模式下,什么时候创建变量以及怎么创建变量都是有限制的。
3.1.1 不允许意外创建全局变量
未声明变量在严格模式与非严格模式下的区别:
- 非严格模式:即使
message
前面没有var
关键字,也没有定义为全局对象的属性;也可以将它创建为全局变量 - 严格模式 :如果给一个没有声明的变量赋值或者变量名拼写错误。那代码在执行的时候就会抛出
ReferenceError
这个错误
message = 'Hello World!'
console.log(window.message) //'Hello World!'
'use strict'
message = 'Hello World!'
console.log(window.message); //Uncaught ReferenceError: message2 is not defined
3.1.2 不能对变量调用delete操作符
- 非严格模式:允许使用
delete
删除元素,但会静态默认失败(也就是删除不了,但是不会报错,哈哈) - 严格模式:删除变量也会导致错误
var color = 'red';
delete color;
console.log(color); //'red'
'use strict'
var color = 'red';
delete color;
console.log(color); //Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
3.1.3 对变量名的限制
不能使用 implements
、interface
、let
、package
、
private
、protected
、public
、static
和 yield
作为变量名。这些都是保留字,将来的 ECMAScript
版本中可能会用到它们。
- 非严格模式:使用上面的关键字不会报错,但是最好不要用(变量的命名规范中有一条就是不能使用JS中的关键字和保留字)
- 严格模式下:用以上标识符作为变量名会导致语法错误。
var implements=1;
console.log(implements); //1
'use strict'
var implements=1;
console.log(implements);//Uncaught SyntaxError: Unexpected strict mode reserved word
3.2 对象
在严格模式下操作对象比在非严格模式下更容易导致错误。
- 非严格模式下会静默失败的情形
- 在严格模式下就会抛出错误
因此,在开发中使用严格模式会加大早发现错误的可能性。
3.2.1 在下列情形下操作对象的属性会导致错误:
- 为只读属性赋值会抛出
TypeError
; - 对不可配置的(nonconfigurable)的属性使用
delete
操作符会抛出TypeError
; - 为不可扩展的(nonextensible)的对象添加属性会抛出
TypeError
。
"use strict";
// 给不可写属性赋值
var obj1 = {
};
Object.defineProperty(obj1