ECMAscript 5运行模式:严格模式strict mode

strict mode是什么? 
         除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode)。这种模式使得Javascript在更严格的条件下运行,体现了Javascript更合理、更安全、更严谨的发展方向。

有什么用?
       - 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
  - 消除代码运行的一些不安全之处,保证代码运行的安全;
  - 提高编译器效率,增加运行速度;
  - 为未来新版本的Javascript做好铺垫。

 

调用方法

1.针对整个脚本文件:放在脚本文件的第一行,则整个脚本都将以"严格模式"运行。

2.针对单个函数:将"use strict"放在函数体的第一行,则整个函数以"严格模式"运行。

<script>
   "use strict";
   console.log("这是严格模式。");
</script>
//整个脚本调用的变更写法:整个脚本文件放在一个立即执行的匿名函数中,利于文件合并
(function (){
    "use strict";
    console.log("整个脚本严格模式的变更写法");
})();
function strict(){
   "use strict";
   return "这是严格模式。";
}

严格模式下要求

1.变量都必须先用var命令声明,然后再使用。

2.对动态绑定做了一些限制。某些情况下,只允许静态绑定。

              属性和方法到底归属哪个对象,在编译阶段就确定。这样做有利于编译效率的提高,也使得代码更容易阅读,更少出现意外。

    (1)禁止使用with语句

    (2)创设eval作用域

3.增强了安全措施

    (1)禁止this关键字指向全局对象

function f(){
    return !this;
} // 返回false,因为"this"指向全局对象,"!this"就是false
function f(){ 
    "use strict";
    return !this;
} // 返回true,因为严格模式下,this的值为undefined,所以"!this"为true。

    (2)禁止在函数内部遍历调用栈 

4.禁止删除变量:只有configurable设置为true的对象属性,才能被删除。

5.显示报错:

       对一个对象的只读属性进行赋值会报错。

       对禁止扩展的对象添加新属性,会报错。

       删除一个不可删除的属性,会报错。

6.重名错误

     (1)对象不能有重名的属性

     (2)函数不能有重名的参数

7.禁止八进制表示法:不像正常模式整数的第一位如果是0,表示这是八进制数,会报错。

8.arguments对象的限制

    (1)不允许对arguments赋值

    (2)arguments不再追踪参数的变化

    (3)禁止使用arguments.callee

9.函数必须声明在顶层:只允许在全局作用域或函数作用域的顶层声明函数,不允许在非函数的代码块内声明函数。

10.新增一些保留字:implements, interface, let, package, private, protected, public, static, yield。

整理自 javascript严格模式讲解