js学习笔记:严格模式

来源:互联网 发布:html5编程软件 编辑:程序博客网 时间:2024/06/01 08:19

概述

除了正常运行模式,ECMAscript 5添加了第二种运行模式:”严格模式”(strict mode)。顾名思义,这种模式使得Javascript在更严格的条件下运行。

设立”严格模式”的目的,主要有以下几个:

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

进入”严格模式”的标志,是下面这行语句:

  "use strict";

老版本的浏览器会把它当作一行普通字符串,加以忽略。

如何使用

针对整个脚本文件

将”use strict”放在脚本文件的第一行,则整个脚本都将以”严格模式”运行。如果这行语句不在第一行,则无效,整个脚本以”正常模式”运行。

   <script>    "use strict";    console.log("这是严格模式。");  </script>    <script>    console.log("这是正常模式。");kly, it's almost 2 years ago now. I can admit it now - I run it on my school's network that has about 50 computers.  </script>

上面的代码表示,一个网页中依次有两段Javascript代码。前一个script标签是严格模式,后一个不是。

针对单个函数

将”use strict”放在函数体的第一行,则整个函数以”严格模式”运行。

  function strict(){    "use strict";    return "这是严格模式。";  }  function notStrict() {    return "这是正常模式。";  }

与非严格模式的区别

全局变量声明

在非严格模式中,全局变量未经声明就赋值时不会报错的:

a = 2;

而在严格模式中,这种情况则会报错。

因此,严格模式下,变量都必须先用var命令声明,然后再使用。

禁止使用with语句

eval作用域

正常模式下,Javascript语言有两种变量作用域(scope):全局作用域和函数作用域。严格模式创设了第三种作用域:eval作用域

正常模式下,eval语句的作用域,取决于它处于全局作用域,还是处于函数作用域。严格模式下,eval语句本身就是一个作用域,不再能够生成全局变量了,它所生成的变量只能用于eval内部。

  "use strict";  var x = 2;  console.info(eval("var x = 5; x")); // 5  console.info(x); // 2

this的指向

在函数的普通调用中,正常模式下this是会指向全局对象的,但是在严格模式下this则为undefined。

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

因此,使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错。

   function f(){    "use strict";    this.a = 1;  };  f();// 报错,this未定义

arguments、caller、callee

在严格模式下,访问arguments.callee, arguments.caller, anyFunction.caller以及anyFunction.arguments都会抛出异常

    function f1(){    "use strict";    f1.caller; // 报错    f1.arguments; // 报错  }  f1();

禁止删除变量

严格模式下无法删除变量。只有configurable设置为true的对象属性,才能被删除。

"use strict";  var x;  delete x; // 语法错误  var o = Object.create(null, {'x': {      value: 1,      configurable: true  }});  delete o.x; // 删除成功

为只读属性赋值

正常模式下,对一个对象的只读属性进行赋值,不会报错,只会默默地失败。严格模式下,将报错。

 "use strict";  var o = {};  Object.defineProperty(o, "v", { value: 1, writable: false });  o.v = 2; // 报错

重名错误

  • 对象不能有重名的属性

正常模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前面的值。严格模式下,这属于语法错误。

 "use strict";  var o = {    p: 1,    p: 2  }; // 语法错误
  • 函数不能有重名的参数

正常模式下,如果函数有多个重名的参数,可以用arguments[i]读取。严格模式下,这属于语法错误。

    "use strict";  function f(a, a, b) { // 语法错误    return ;  }

禁止八进制表示法

正常模式下,整数的第一位如果是0,表示这是八进制数,比如0100等于十进制的64。严格模式禁止这种表示法,整数第一位为0,将报错。

  "use strict";  var n = 0100; // 语法错误
0 0
原创粉丝点击