引言
- 严格模式是在ECMAscript 5中添加的;
- 严格模式消除Javascript语法的一些不合理、不严谨之处,消除代码运行的一些不安全之处;
- 严格模式提高编译器效率,增加运行速度;
- 如果不主动声明,编译器默认是正常模式;
进入严格模式的方式
- 在脚本第一行声明,则整个脚本都将以”严格模式”运行,如果这行语句不在第一行,则无效,整个脚本以”正常模式”运行;
- 将”use strict”放在函数体的第一行,则整个函数以”严格模式”运行;
1 | "use strict"; |
1 | function strict(){ |
严格模式”严格”了哪些语法行为
- 全局变量必须显式声明
1 | "use strict"; |
1 | "use strict"; |
1 | "use strict"; |
- 严格模式下不能使用with语句
1 | "use strict" |
- 严格模式下,eval作用域发生变化
- 正常模式下,eval语句不形成单独的作用域,eval就相当于将其中的语句直接写到js中;
- 严格模式下,eval语句形成了自己的作用域;
1 | var x = 2; |
1 | "use strict"; |
严格模式增强了哪些安全措施
- this关键字禁止指向全局对象
1 | function f(){ |
1 | "use strict"; |
- 限制使用函数内置对象
- argument对象(比如遍历argument输出传入参数值)及其属性(比如argument.length)仍可使用, 但caller、callee不能使用;
- argument对象不再追踪参数的变化情况;
1 | "use strict"; |
1 | function f(a) { |
- 禁止随意删除变量
- 严格模式下无法删除变量;
- 只有configurable设置为true的对象属性,才能被删除;
1 | "use strict"; |
- 另外
- 严格模式下,一个对象不能有重名的属性;
- 严格模式下,一个函数不能传入重名的参数;
- 严格模式下,禁止八进制表示法;
1 | "use strict"; |
1 | "use strict"; |
严格模式下的对象操作
- 正常模式下,对一个对象的只读属性进行赋值,不会报错,只会默默地失败,严格模式下将报错;
1 | "use strict"; |
- 严格模式下,对一个使用getter方法读取的属性进行赋值,会报错;
1 | "use strict"; |
- 严格模式下,对禁止扩展的对象添加新属性,会报错;
1 | "use strict"; |
- 严格模式下,删除一个不可删除的属性,会报错;
1 | "use strict"; |
保留字
- 为了向将来Javascript的新版本过渡,严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield;
- 用这些新增保留字做变量名,正常模式不会报错,严格模式报错;
1 | "use strict" |