ECMAScript5之StrictMode

ECMAScript5引入一个严格模式的概念(Strict Mode)。

它的作用就是不让Javascript的容错那么高,让我们对编写代码的规范要求高一点。

比如,当我们使用严格模式编写JavaScript代码时,我们不能隐式的申明变量,必须带var。

那怎么使用严格模式(Strict Mode)呢?

当我们想让代码启动严格模式(Strict Mode)时,我们可以在代码的开头或者函数function的开头中添加”use strict”。

倘若我们在整个代码中启用严格模式(Strict Mode),那么所有代码都必须遵循严格模式的规范;

倘若我们在一个function中启用,那么只在这个function中,得遵循严格模式的规范。

我们一起来写个demo,体验体验下。

<!DOCTYPE html>
    <head>
        <title>strict mode</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    </head>
    <body>
        <script>
            //启用严格模式
            "use strict";
            function testFunction(){
                var testvar = 4;
                return testvar;
            }
            //This causes a syntax error.
            testvar = 5;
        </script>
    </body>
</html>

在上面的demo中,我在整个代码中启用严格模式,但我在function的外部声明变量时,没有加var,因此不符合严格模式规范,所以运行代码时会报错。

哈,有点意思。

刚才我们是在整个代码中启用严格模式,下面我们再来写个demo,在function里启用严格模式。

<!DOCTYPE html>
    <head>
        <title>strict mode</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    </head>
    <body>
        <script>
            function testFunction(){
                "use strict";
                testvar = 4;
                return testvar;
            }
            testvar = 5;
        </script>
    </body>
</html>

打开chrome调试器:

纳尼!!怎么没有报错?!!

我们再看看上面的代码,哈哈哈,原来是我们没有调用testFunction嘛,既然没执行它,它怎么会启用严格模式呢?

修改代码如下:

<!DOCTYPE html>
    <head>
        <title>strict mode</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    </head>
    <body>
        <script>
            function testFunction(){
                "use strict";
                testvar = 4;
                return testvar;
            }
            //调用testFunction
            testFunction();
            testvar = 5;
        </script>
    </body>
</html>

再看看chrome结果:

哇咔哇咔,严格模式还是挺严格的嘛,如果我们在写代码中,想启用的严格模式,那就得注意咯。

下面列举了在严格模式下的几个重点限制:


JavaScript


限制


例子


变量


使用一个变量,但是没有用var去声明


testvar = 4;


delete


删除一个变量,函数或者agrument


var testvar = 15;

function testFunc(){}

//causes fault

delete testvar;

delete testFunc;


属性名


在声明对象时,重复使用一个属性名


Var testObj = {

Prop1: 10,

Prop2: 15,

//causes fault

Prop1: 20

}


参数名


在函数参数中,重复使用一个参数名


Function testFunc(param1,/*causes fault*/param1){

Return 1;

}


有潜力成为关键字


在未来有可能成为有用的关键字,不能用来作为变量名或者函数名


Implements

Interface

Package

Private

Protected

Public

Static

yield


八进制数


将八进制数赋给一个变量


Var testoctal = 010;

Var testescape = \010;


this


当this为null或者undefined的时候,它是不能被转换成全局对象(window)的


Function testFunc(){

Return this;

}

Var testvar = testFunc();

在不是严格模式下,这个testvar的值是全局对象,但在严格模式下,它的值却是undefined.


Eval,arguments


eval,arguments不能作为函数名或者参数名、变量名


Var eval = 10;

Var arguments =10;


arguments


在函数中,我们不能通过改变arguments,来改变对应参数值


Function testArgs(oneArg){

Arguments[0] = 20;

}

在非严格模式下,我们如果想改变oneArg,可以通过Arguments[0]来改变,如上代码这样,执行后,oneArg和Arguments[0]的值都是20;但是在严格模式下,我们不能通过arguments来改变参数名的值,arguments仅仅是一个拷贝而已。


Arguments.callee


不允许这么使用


Function(testInt){

If(testInt-- == 0){

Return;

}

Arguments.callee(testInt);

}

时间: 2024-08-24 03:42:05

ECMAScript5之StrictMode的相关文章

Javascript (ECMAScript5) 的细节和违反直觉的地方

记录在学习Javascript (ECMAScript5) 中的一些与其他语言的不同之处,本文会不断更新. 里面的知识可能并不太适合有一定经验的Javascript程序员,仅仅但不限于给初学者阅读.  1. null 是一个表示"空"的对象指针 var foo = null console.log(typeof foo) //输出 object 而不是你所认为的 null  2. undefined 是 null 派生而来的 console.log(null == undefined)

Android严苛模式StrictMode使用详解

StrictMode类是Android 2.3 (API 9)引入的一个工具类,可以用来帮助开发者发现代码中的一些不规范的问题,以达到提升应用响应能力的目的.举个例子来说,如果开发者在UI线程中进行了网络操作或者文件系统的操作,而这些缓慢的操作会严重影响应用的响应能力,甚至出现ANR对话框.为了在开发中发现这些容易忽略的问题,我们使用StrictMode,系统检测出主线程违例的情况并做出相应的反应,最终帮助开发者优化和改善代码逻辑. 官网文档:http://developer.android.c

StrictMode介绍

Android 2.3起新增加了android.os.StrictMode.这个类可以用来帮助开发者改进他们编写的应用,并且提供了各种的策略,这些策略能随时检查和报告开发者开发应用中存在的问题,比如可以监视那些本不应该在主线程中完成的工作或者其他的一些不规范和不好的代码. 目前,有两大类的策略可供使用,一类是关于常用的监控方面的,另外一类是关于VM虚拟机等方面的策略. 1.常用的监控方面的策略: (1)Disk Reads 磁盘读 (2)Disk Writes 磁盘写 (3)Network ac

ECMAScript5中的对象存取器属性:getter和setter

显然这是一个无关IE(高级IE除外)的话题,尽管如此,有兴趣的同学还是一起来认识一下ECMAScript5标准中getter和setter的实现.在一个对象中,操作其中的属性或方法,通常运用最多的就是读(引用)和写了,譬如说o.get,这就是一个读的操作,而o.set = 1则是一个写的操作.事实上在除ie外最新主流浏览器的实现中,任何一个对象的键值都可以被getter和setter方法所取代,这被称之为“存取器属性”. 毫无疑问,getter负责查询值,它不带任何参数,setter则负责设置键

StrictMode使用详解

StrictMode StrictMode最常用来捕捉应用程序的主线程,它将报告与线程及虚拟机相关的策略违例.一旦检测到策略违例(policy violation),你将获得警告,其包含了一个栈trace显示你的应用在何处发生违例.除了主线程,我们还可以在Handler,AsyncTask,AsyncQueryHandler,IntentService等API中使用StrictMode. 检查策略 StrictMode的线程策略主要用于检测磁盘IO和网络访问,而虚拟机策略主要用于检测内存泄漏现象

EcmaScript5和EcmaScript6规范一览表

EcmaScript5.1规范于2011年6月发布,现在主流的浏览器基本上都已经支持,这些浏览起包括IE9.IE10,ff21及其以上,safari6及其以上,opera12及其以上都已经基本支持.具体的测试情况可以在线测试,用来确定你使用的浏览器是否支持. 测试网站: http://kangax.github.io/compat-table/es5/ 详细的5.1规范描述可以下载到pdf文件和html文件,可以作为日常规范的参考,详细的地址可以戳这里 http://www.ecma-inter

ECMAScript5新增数组API的一些细节

ECMAScript5新增的数组方法看似都比较简单其实还是有一些细节需要了解的 首先这些方法都不会作用于原数组,其次是在对稀松数组的处理上. (1)这些方法在稀松数组缺少的元素上都不会执行回调函数 (2)map的返回值包括稀松数组缺少的元素,而filter方法会过滤掉稀松数组的缺少元素,从而返回的都是一个紧凑的数组 var a = new Array(10); a[0] = null ; a[1] = undefined; var _a = a.map(function(){ return 1;

ECMAScript5 ES5

ECMAScript5新增一系列新的方法(API接口),新的浏览器中大部分是被支持的(IE9,Chrome,FirFor),有少量API不是所有浏览器都支 持 ES5通过对现有JavaScript方法添加语句和原生ECMAScript对象做合并实现标准化,IE9不支持严谨模式,但IE10是支持的. Object.create(prototype, descriptors) 以指定的原型创建对象,并且可以(可选)的设置对象的属性 function Poker(style, title, value

js中map,forEach,filter,reduce等方法是ECMAScript5 Array新增方法

数组在各个编程语言中的重要性不言而喻,但是在之前的JavaScript中数组(JavaScript 数组详解)虽然功能已经很强大,但操作方法并不完善,在ECMAScript5中做了适当的补充. Array.isArray(element) 这是Array对象的一个静态函数,用来判断一个对象是不是数组 var a = new Array(123); var b = new Date(); console.log(Array.isArray(a)); //true console.log(Array