JS 严格模式与非严格模式的区别

在 JavaScript 脚本的开头添加

"use strict";

'use strict';

即可使用严格模式,在函数内部的开头添加则表示只在函数内使用严格模式。

为什么使用严格模式?

1.可以避免一些不合理、不严谨 JavaScript 代码逻辑(如给未定义的变量赋值会报错);

2.提高 JavaScript 代码运行的安全性(如 eval() 函数会创建独立的作用域);

3.提高 JavaScript 解释器的编译效率,提升代码运行性能;

4.为未来新版本的 JavaScript 做好铺垫。

严格模式与非严格模式的区别

1.在严格模式下,不允许对未声明的变量赋值,否则将会报 ReferenceError (引用错误)。而在非严格模式,给未声明的变量赋值,会将该变量当成全局变量进行赋值。

2.在严格模式下,不允许删除变量或函数,否则将会报 SyntaxError(语法错误)。而在非严格模式,删除变量或函数虽然不会成功,但不会报错。

3.在严格模式下,函数的参数不允许同名,否则将会报 SyntaxError(语法错误)。而在非严格模式,函数后面的参数会覆盖前面的同名参数。

4.在严格模式下,对象的属性不允许同名,否则将会报 SyntaxError(语法错误)。而在非严格模式,对象后面的属性会覆盖前面的同名属性。

5.在严格模式下,不允许使用八进制,否则将会报 SyntaxError(语法错误)。而在非严格模式,可以使用八进制。

6.在严格模式下,不允许对对象的只读属性赋值,否则将会报 TypeError(类型错误)。而在非严格模式,对对象的只读属性赋值虽然不会成功,但不会报错。

7.在严格模式下,不允许删除对象的不可删除的属性时,否则将会报 TypeError(类型错误)。而在非严格模式,删除对象的不可删除的属性虽然不会成功,但不会报错。

8.在严格模式下,不允许使用 with 语句,否则将会报 SyntaxError(语法错误)。而在非严格模式,可以使用 with 语句。

9.在严格模式下,调用函数内 this 的值是 undefined。而在非严格模式,调用函数内 this 指向全局对象 window。

10.在严格模式下,不允许将 eval、arguments 作为变量名,否则将会报 SyntaxError(语法错误)。而在非严格模式,可以将 eval、arguments 作为变量名。

11.在严格模式下,函数的 arguments 对象会保存函数被调用时的原始参数。arguments[i] 的值不会与对应的参数的值的改变相关联,反之亦然。而在非严格模式,参数的值改变对应的 arguments[i]也会改变,反之亦然。

12.在严格模式下,函数内部不允许使用 arguments.callee 来获取当前正在执行的函数,否则将会报 TypeError(类型错误)。而在非严格模式,可以使用 arguments.callee。

13.在严格模式下,eval() 函数会创建独立的作用域。而在非严格模式,eval() 的作用域就是它所处在的作用域。

14.在严格模式下,在 if 语句中声明函数不会成功。而在非严格模式,在 if 语句中可以声明函数,但不会被提升。

15.在严格模式下,有更多的保留字以向将来 JavaScript 的新版本过渡。严格模式新增的保留字:implements、interface、let、package、private、protected、public、static、yield。

此条目发表在JavaScript分类目录,贴了, , , 标签。将固定链接加入收藏夹。