js除了在普通的常规模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode)。严格模式支持IE9+ Chrome FireFox 等主流浏览器。

定义严格模式

使用'use strict'规定严格模式,'use strict'必须写在代码块顶部,可以定义在整个js文件顶部(作用域就是整个js文件),也可以定义在某个function中第一行(作用域仅是function函数)。

'use strict'
document.write('这是严格模式');

如上代码,即整个js文件定义为严格模式

        y = 2;
document.write('这是普通模式' + y); 
fun();
function fun(){
'use strict'
document.write('这是严格模式');
}

如上代码,既仅fun()函数定义为严格模式

        y = 2;
document.write(y);
'use strict' //如果'use strict'被定义在中间,严格模式不生效
x = 1;
document.write(x);

定义在代码中间的'use strict'被视为字符串处理

(严格地说,只要前面不是产生实际运行结果的语句,"use strict"可以不在第一行,比如直接跟在一个空的分号后面。)

严格模式作用

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

严格模式与普通模式的区别

  1. 在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,全局变量必须显式声明。严格模式下,变量都必须先用var命令声明,然后再使用。

            "use strict";
      v = 1; // 报错,v未声明
      for(i = 0; i < 2; i++) { // 报错,i未声明
      }
  2. 禁止使用with语句,在严格模式下with直接被视为语法错误。
            "use strict";
      var v = 1;
      with (o){ // 语法错误
        v = 2;
      }
  3. eval有独立作用域。
            "use strict";
      var x = 2;
      console.log(eval("var x = 5; x")); // 输出5
      console.log(x); // 输出2

    普通模式:JS有两种变量作用域:全局作用域和函数作用域

    严格模式:除了全局作用域和函数作用域外,创设了第三种作用域:eval作用域。所以eval在严格模式下独立为一个作用域。

    正常模式:eval语句的作用域,取决于它处于全局作用域,还是处于函数作用域。

    严格模式:eval语句本身就是一个作用域,不再能够生成全局变量了,它所生成的变量只能用于eval内部。

  4. 禁止this关键字指向全局对象。
    //普通模式下,this默认指向全局对象     
    fun();
    function fun(){
    console.log(this.a); //输出undefined
    }
    //严格模式下,禁止this指向全局对象,这样this的指向就更严谨。弥补了js天生的"太随意"
    "use strict";
     fun();
    function fun(){
    console.log(this.a); //直接报错。
    }
  5. 禁止在函数内部遍历调用栈。
         function f1(){
        "use strict";
        f1.caller; // 报错
        f1.arguments; // 报错
      }
      f1();
  6. 严格模式下的显式报错。
    1. 普通模式下,对一个对象的只读属性进行赋值,不会报错,只是默默地失败。严格模式下,将报错。

        "use strict";
        var o = {};
        Object.defineProperty(o, "v", { value: 1, writable: false });
        o.v = 2; // 报错
    2. 严格模式下,对一个使用getter方法读取的属性进行赋值,会报错。
        "use strict";
        var o = {
          get v() { return 1; }
        };
        o.v = 2; // 报错

    总之,在严格模式下,很多错误都会显示报错,不在忽略或直接处理为undefined。这样大大方便了bug的效率。

  7. 重名错误。

    在严格模式下增加了重名检查,函数内属性重名不再是后面覆盖前面,而是直接报错。

        "use strict";
      var o = {
        p: 1,
        p: 2
      }; // 报错

    而且严格模式下,函数的参数也不能重名。

        "use strict";
      function f(a, a, b) { // 报错
        return ;
      }
  8. 函数必须声明在顶层

    将来Javascript的新版本会引入"块级作用域"。为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。

      "use strict";
      if (true) {
        function f() { } // 语法错误
      }
      for (var i = 0; i < 5; i++) {
        function f2() { } // 语法错误
      }
  9. 新增保留字

    为了向将来Javascript的新版本过渡,严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。所以使用这些保留字作为变量名会报错。

      "use strict";
    var let; //语法错误
    function package(protected) { // 语法错误
        "use strict";
        var implements; // 语法错误
      }

本文参照http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html,详细了解。

JavaScript的严格模式的更多相关文章

  1. 深入理解JavaScript中创建对象模式的演变(原型)

    深入理解JavaScript中创建对象模式的演变(原型) 创建对象的模式多种多样,但是各种模式又有怎样的利弊呢?有没有一种最为完美的模式呢?下面我将就以下几个方面来分析创建对象的几种模式: Objec ...

  2. JavaScript高级---门面模式设计

    门面模式 两个作用: 1.简化类的接口 2.消除类与使用它的客户代码之间的耦合 门面模式常常是开发人员最亲密的朋友.它几乎是所有javascript库的核心原则 门面模式的目的是为了让开发人员用更简单 ...

  3. JavaScript高级---组合模式设计

    一.设计模式 javascript里面给我们提供了很多种设计模式: 工厂.桥.组合.门面.适配器.装饰者.享元.代理.观察者.命令.责任链 在前面我们实现了工厂模式和桥模式 工厂模式 : 核心:为了生 ...

  4. JavaScript高级---桥模式设计

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  5. JavaScript实现策略模式

    在开篇之前先分享今天看到的一句关于设计模式的话:将不变的部分和变化的部分隔开是每个设计模式的主题 请大家自行感受这句话的精髓所在,并且思考学习设计模式究竟能给我们编程带来什么样的东西,欢迎大家在文章下 ...

  6. javascript闭包(Module模式)的用途和高级使用方式

    javascript闭包(Module模式)的用途和高级使用方式 javascript闭包的用途:1. 匿名自执行函数:或者可以理解为,避免污染全局变量2. 缓存:源于闭包的核心特性便是保存状态,应用 ...

  7. javascript的继承模式

    在javascript里面看到javascript的继承模式和传统的继承模式是有区别的,就想查资料看一下到底有区别,就看到了这篇文章,觉得讲得还可以,暂时先放上来,以后有别的东西再补充: http:/ ...

  8. JavaScript的严格检查模式

    JavaScript的严格检查模式 前提:IDEA设置为ECMAScript 6语法. 'use strict':严格检查模式,用来预防JS的随意性导致的问题. 比如:直接 i=1;这样定义成了全局变 ...

  9. JavaScript之命名空间模式 浅析

    来源于:http://www.cnblogs.com/syfwhu/p/4885628.html 前言 命名空间可以被认为是唯一标识符下代码的逻辑分组.为什么会出现命名空间这一概念呢?因为可用的单词数 ...

  10. Javascript use strict模式和对象

    use strict 只能出现在脚本代码的开始或者函数体的开始.任何实体语句之前.Javascript的具体实现将它们解析为解释器自有的指令.这个指令的目的是说明后续的代码将会解析为严格代码. ECM ...

随机推荐

  1. android 数据库操作详解

    请看郭大神的八篇专栏,包含sql语句  android封装的databasehelper 和郭大神自己的LitePal  三种使用详解 http://blog.csdn.net/column/deta ...

  2. 三对角矩阵(Tridiagonal Matrices)的求法:Thomas Algorithm(TDMA)

    转载http://www.cnblogs.com/xpvincent/archive/2013/01/25/2877411.html 做三次样条曲线时,需要解三对角矩阵(Tridiagonal Mat ...

  3. (jdbc)取得数据库自动生成的主键方法

    一些类,在前面的博客中有,就不重复了 public class Test2 { TestDAO t=new TestDAO(); /*前提是数据表的主键是自动增加的, *取得数据库自动生成的主键 * ...

  4. U3D刚体测试1-刚体非刚体物体非Kinematic等之间的碰撞关系

    Unity官方有一个详细的碰撞关系表:http://docs.unity3d.com/Manual/CollidersOverview.html 但其实可以精简为以下几点: 1.两个勾选kinemat ...

  5. 使用Texture2D创建Cubemap

    网上有很多,但大多使用Camera.RenderToCubemap接口,不能满足需求. 写了段代码可以载入Texture2D生成Cubemap(在Editor下运行): /// <summary ...

  6. LTE切换与TAU问题

    假如有两个LTE基站A B(同频组网) AB TAC不同 且添加了双向邻区关系 现终端开机重选至A然后往B方向移动 是先切换呢?还是先进性TAU更新 这个没有影响,,TAU并非需要在IDLE状态下才能 ...

  7. JAVA基础知识之多线程——线程通信

    传统的线程通信 Object提供了三个方法wait(), notify(), notifyAll()在线程之间进行通信,以此来解决线程间执行顺序等问题. wait():释放当前线程的同步监视控制器,并 ...

  8. js的解析--预处理(三)

    js的解析与执行过程  分全局  {预处理阶段和执行阶段}  函数{预处理函数和执行阶段}   1/创建词法环境(环境上下文) LexicalEnvironment   === window { } ...

  9. Educational Codeforces Round 16 B

    Description You are given n points on a line with their coordinates xi. Find the point x so the sum ...

  10. JS中innerHTML 和innerText和value的区别

    (1)innerHTML 和innerText和value的区别: innerHTML innerText是对非表单元素进行操作的. value是对表单元素进行操作的. (2)innerHTML 和i ...