现在的位置: 首页 > javascript > 正文
Javascript严格模式
2013年01月21日 javascript ⁄ 共 2780字 暂无评论 ⁄ 被围观 3,195 views+

ECMAScript5将严格模式(strict mode)引入Javascript,顾名思义,这种模式使得Javascript在更严格的条件下运行,简单的说就是以严格的方式去检测函数的内部错误,它禁止了ECMAScript3中一些不推荐使用的用法,阻止一些相对不安全的操作。如果开发者的代码能够顺利通过严格模式,至少比那些不能通过的代码的质量要好,并且相对来说出现意外崩溃的几率会更低点

1. 引入严格模式的目的

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

2. 如何实现

既然严格模式这么多好处,那么如何实现呢。先看如下代码:

<script  type="text/javascript">
   "use strict";//启用严格模式
   function getName()
   {
       var userName='zhangSan';
       return userName;
   }
</script>

上面的代码除了多一个"use strict"之外和别的代码没什么区别,然而就是这个"use strict"让javascript进入严格模式,"use strict"是进入严格模式的标志,这个东西的位置和它控制的范围还是有联系的,如果"use strict"在全局,则全局进入严格模式,如果在局部,则局部进入严格模式。例如:

<script type="text/javascript">
     //全局严格模式
    "use strict";
     var  person='zhang';
     function getName()
     {
          //严格模式
     }

     function getAge()
    {
         //严格模式
    }
</script>

局部严格模式如下:

<script type="text/javascript">

      var person='张三';

      function getAge()
     {
           "use strict";//getAge函数局部严格模式

     }

     function getName()
     {
           //不是严格模式
     }
</script>

3.严格在那?

既然称为严格模式,那究竟严格在那里呢?
(1) 去除with语句

在严格模式下确保不会出现with语句,否则,则会报错,如下代码,在严格模式下将会报错

with(document)
{
      write("123");
}

(2)变量需先声明才可使用
在严格模式下,使用变量前必选确保变量已经声明过,否则就会报错。如下代码就会报错

function getName()
{
      userName='smile';
      alert(userName);//严格模式下,错误
}

(3)当 this 的值为 null 或 undefined 时,该值不会转换为全局对象
当this值为null或undefined时,不会再将其强制转换为全局对象。也就是说,this保留了它的原始值,也因此可能会导致一些依赖于强制转换的代码发生错误。例如:

window.helloString='hello';

function sayHello()
{
       alert(this.helloString);
}

sayHello();//严格模式下报错

根本而言,this值必须赋值,否则将保留undefined值。这意味着调用构造函数时若漏掉了new关键字也会导致错误:

function Person(name) {  
    this.name = name;  
}  

// 严格模式下导致错误  
var me = Person("zhang");

在这段代码里,调用Person构造函数时缺少了new关键字,此时this值为undefined。由于你不能给undefined添加属性,这段代码抛出了一个错误。在非严格模式下,this会强制转换为全局对象,因此name属性能够被正确赋值为全局变量。
(4)拒绝参数属性名重复
当对象的属性名重复或者函数参数名重复时,在严格模式下会报错,如下:

<script type="text/javascript">
	"use strict";
	function add(num1,num2)
	{
		alert(num1+num2);//严格模式下报错 Uncaught SyntaxError:Strict mode function may not duplicate parameter names
	}

	var person=
			{
				name:'zhang',
				age:15,
				name:false//严格模式下报错 Uncaught SyntaxError:Duplicate data property in object literal not allowed in strict mode
			}

	add(1,1);
</script>

(5)在 eval 函数内声明变量,则不能在此函数外部使用该变量
如果在 eval 函数内声明变量,则不能在此函数外部使用该变量。代码如下:

<script type="text/javascript">
	"use strict";
	 eval('var a=10');
	 alert(a);//严格模式错误,Uncaught ReferenceError:a is not defined
</script>

(6)不可改变强行改变
ECMAScript 5 同时引入了修改属性特征的能力,例如设置一个属性为只读或者冻结整个对象的结构。在非严格模式下,试图修改一个不可变的属性时将悄无声息地失败。你可能在使用一些原生APIs的时候已经遇到这类问题。严格模式将保证无论你在何时试图使用一种不被允许的方式修改一个对象或对象的属性时抛出错误。

var person = {};  
 Object.defineProperty(person, &amp;quot;name&amp;quot; {  
    writable: false,  
    value: 'zhang' 
});  

// 非严格模式下将悄无声息地失败,严格模式则抛出错误  
person.name ='li';

(7)函数主体内,不能改变参数

function setAge(age)
{
      age=10;
      alert(age);
}
setAge(20);//严格模式下为20 ,非严格模式下为10

(8)不能使用implements、interface、let、package、private、protected、public、static、yield,为以后预留关键字
(9)函数的声明位置,只能在脚本的顶级和函数的内部声明

4.浏览器支持

IE10+,Firefox4+,Chrome11+,Opera11.6+,Safari5.14+

5.建议

建议大家使用严格模式,不仅可以降低错误发生的概率,也可养成严谨的编程习惯。

给我留言

留言无头像?


×