JavaScript起点(严格模式深度了解)

 更新时间:2013年01月28日 14:17:00   作者:   我要评论
严格模式(Strict Mode)是ECMAScript5新增的功能,目前所有的主流浏览器的最新版本——包括IE10与Opera12——都支持严格模式,感兴趣的朋友可以了解下啊,希望本文对你有所帮助
严格模式(Strict Mode)是ECMAScript5新增的功能。ECMAScript5虽然可以向后兼容ECMAScript3,但如果使用严格模式,哪些ECMAScript5“不在建议使用”的ECMAScript3语法功能将会被全部进制,如果出现就会抛出一行。引入Strict Mode目的是允许开发人员能够选择“更好”的Javascript版本,这个版本能用不同的方式处理那些普遍而又臭名昭著的错误。目前所有的主流浏览器的最新版本——包括IE10与Opera12——都支持严格模式。关于严格模式的大多数信息都可以在《ES5规范》[PDF]的第223页找到。

如何启用严格模式
可以在全局范围内使用严格模式,也可以在一个函数范围内使用严格模式。如果要再全局范围内启用严格模式,只需要在程序的第一行使用代码即可:
复制代码 代码如下:

'use strict';

在函数的内部启用严格模式,只需要在函数体内第一行使用代码即可:
复制代码 代码如下:

function imStrict(){
  'use strict';
  // ... 其他代码 ...
}

启用严格模式的语句只是一段普通的字符串“use strict”,没有任何新语法。这意味着不会对就旧式浏览器造成任何负面影响,因此可以大胆使用。

在函数内部启用严格模式的一个实际应用是,把整个Javascript类库定义在严格模式的函数内部,这样就可以不影响外部的代码:
复制代码 代码如下:

(function(){
  "use strict";
  // Define your library strictly...
})();

严格模式带来了什么?
在开始介绍特殊特性之前,你需要记住,严格模式的目标之一是允许更快地调试错误。帮助开发者调试的最佳途径是当确定的问题发生时抛出相应的错误(throw errors when certain patterns occur),而不是悄无声息地失败或者表现出奇怪的行为(这正是如今不在严格模式下的Javascript做的)。严格模式下的代码抛出更多的错误信 息,这是好事,因为它能帮助开发者很快注意到一些必须立即解决的问题。

去除with语句(Eliminates with)
首先,严格模式去除了with语句。当with语句出现在严格模式中时,它会被认为是非法的Javascript语句并抛出语法错误。所以,使用严格模式的第一步就是确保你没有在使用with。
复制代码 代码如下:

// 在严格模式中将导致语法错误
with(location){
alert(href);
}

防止意外的全局变量(Prevents accidental globals)
第二点是,变量在赋值之前必须声明。在非严格模式下,给一个未声明的变量赋值将自动生成一个该名字的全局变量。这是Javascript中最普遍的错误之一。严格模式中,这样做将抛出一个错误。
复制代码 代码如下:

// 严格模式中抛出一个错误
(function(){
someUndeclaredVar ="foo";
}());

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

window.color ="red";
function sayColor(){
// 严格模式下,this不会指向window
alert(this.color);
}
// 以下两种情况,在严格模式下都抛出错误
sayColor();
sayColor.call(null);

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

functionPerson(name){
this.name = name;
}
// 严格模式下导致错误
var me =Person("Nicholas");

在这段代码里,调用Person构造函数时缺少了new关键字,此时this值为undefined。由于你不能给undefined添加属性,这段代码抛出了一个错误。在非严格模式下,this会强制转换为全局对象,因此name属性能够被正确赋值为全局变量。
拒绝重复(No duplicates)
当你做了大量的编码的时候,你很容易在对象中定义了重复的属性或者给函数定义了重复的参数名。严格模式下,这两种情况都会导致错误的发生:
复制代码 代码如下:

// 严格模式下错误 - 重复参数
function doSomething(value1, value2, value1){
//code
}
// 严格模式下错误 - 重复属性
var object ={
foo:"bar",
foo:"baz"
};

这两者都是语法错误,在代码执行之前将抛出错误。
更安全的eval()(Safer eval())
eval()没有被移除,但它在严格模式下发生了一些变化。最大的改变是:在eval()语句中声明的变量以及函数不会在包含域中创建。例如:
复制代码 代码如下:

(function(){
eval("var x = 10;");
// 非严格模式下,x为10
// 严格模式下,x没有声明,抛出一个错误
alert(x);
}());

任意由eval()创建的变量或函数仍呆在eval()里。然而,你可以通过从eval()中返回一个值的方式实现值的传递:
复制代码 代码如下:

(function(){
var result =eval("var x = 10, y = 20; x + y");
// 严格模式与非严格模式下都能正常工作(得到30)
alert(result);
}());

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

var person ={};
Object.defineProperty(person,"name"{
writable:false,
value:"Nicholas"
});
// 非严格模式下将悄无声息地失败,严格模式则抛出错误
person.name ="John";

这个例子中,name属性被设置为只读。在非严格模式下,对name的赋值将悄无声息地失败;而在严格模式下,一个错误将被抛出。

:如果你在使用ECMAScript属性能力(the ECMAScript attribute capabilities),我强烈推荐你开启严格模式。如果你在改变对象的可变性(mutability of objects),你将遇到一堆错误,而它们在非严格模式下将被安静地带过。

相关文章

  • input 高级限制级用法

    input 高级限制级用法

    当inpupt需要用户输入的时候,可以用的到
    2009-03-03
  • 对JavaScript客户端应用编程的一些建议

    对JavaScript客户端应用编程的一些建议

    这篇文章主要介绍了对JavaScript客户端应用编程的一些建议,主要针对MVC框架框架的一些相关使用问题,需要的朋友可以参考下
    2015-06-06
  • 解析JavaScript中的标签语句

    解析JavaScript中的标签语句

    本篇文章是对JavaScript中的标签语句进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • JS backgroundImage控制

    JS backgroundImage控制

    JS backgroundImage控制代码。
    2009-05-05
  • Javascript入门学习第二篇 js类型

    Javascript入门学习第二篇 js类型

    上篇文章讲了js中的一些概念(词法结构) 和 数据类型(部分)。 这章我们 继续.然后了解下js中操作数据 和 函数的 作用域。
    2008-07-07
  • JS键盘的键码(event.keyCode)图片版

    JS键盘的键码(event.keyCode)图片版

    js获取键盘按键的键码event.keyCode,下面则是键盘的键码分布,记录一下,以备不时之需
    2013-01-01
  • Javascript基础学习笔记(菜鸟必看篇)

    Javascript基础学习笔记(菜鸟必看篇)

    下面小编就为大家带来一篇Javascript基础学习笔记(菜鸟必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • 浅析JavaScript基本类型与引用类型

    浅析JavaScript基本类型与引用类型

    这篇文章主要介绍了JavaScript基本类型与引用类型详解,讲解了如类型的判断、类型的转换、类型的复制等内容,需要的朋友可以参考下
    2014-05-05
  • Javascript入门学习第一篇 js基础

    Javascript入门学习第一篇 js基础

    这是我看了DOM编程艺术,悟透JavaScript,javascript权威指南5做的笔记,我资质不深,不能写出高深的文章, 如果你觉得笔记写得不好,可以不看我以后的。这篇文章就当作浪费你几分钟。
    2008-07-07
  • JavaScript操作HTML DOM节点的基础教程

    JavaScript操作HTML DOM节点的基础教程

    这篇文章主要介绍了JavaScript操作HTML DOM节点的基础入门教程,包括对节点的创建修改删除等操作,还特别提到了其中appendChild()与insertBefore()插入节点时需注意的问题,需要的朋友可以参考下
    2016-03-03

最新评论