一、严格模式的主要目的
1、消除javascript语法的不合理,不严谨之处,减少怪异行为;
2、消除代码运行的不安全之处,保证代码运行的安全;
3、提高编译器效率,增加运行速度;
4、位未来版本的javascript做好铺垫。
二、进入标志
“use strict”;
三、调用方式
1、针对整个脚本文件:将“use strict”放在脚本文件的第一行,则整个脚本都将以严格模式运行,若这行语句不在第一行,则无效(缺点,不利于js文件的合并)
2、针对单个函数:将“use strict”放在函数体的第一行,则整个函数以严格模式运行。
3、脚本文件的变通写法:借用第二种方法,将整个脚本文件放在一个立即执行的匿名函数中。
(function(){
“use strict”
//some code here
})();
四、语法和行为的改变
1、全局变量的声明
正常模式中,一个变量没有声明就赋值,默认是全局变量。严格模式的全局变量必须显示声明。
2、静态捆绑
动态捆绑:属性和方法到底属于哪一个对象,不是在编译时确定的,而是在运行时确定的。严格模式对动态捆绑做了一些限制,只允许静态捆绑,在编译时确定属性和方法输入哪个对象。这样有理由编译效率的提高,使代码容易阅读,少出意外。
1)禁用with语句
2)正常模式下,Javascript语言有两种变量作用域(scope):全局作用域和函数作用域。严格模式创设了第三种作用域:eval作用域。
正常模式下,eval语句的作用域,取决于它处于全局作用域,还是处于函数作用域。严格模式下,eval语句本身就是一个作用域,不再能够生成全局变量了,它所生成的变量只能用于eval内部。
"use strict";
var x = 2;
console.info(eval("var x = 5; x")); // 5
console.info(x); // 2
3增强的安全措施
禁止this关键字指向全局对象、禁止在函数内部遍历调用栈、严格模式下无法删除变量。只有configurable设置为true的对象属性,才能被删除。