严格模式是一种将更好的错误检查引入代码中的方法。 在使用严格模式时,您无法使用隐式声明的变量、将值赋给只读属性或将属性添加到不可扩展的对象。

〉声明严格模式

可以通过在文件、程序或函数的开头添加 "use strict"; 来声明严格模式。 此类声明称作“指令序言”。 严格模式声明的范围取决于其上下文。 如果在全局上下文(函数的范围之外)中声明严格模式,则程序中的所有代码都处于严格模式。 如果在函数中声明严格模式,则函数中的所有代码都处于严格模式。 例如,在下面的示例中,所有代码都处于严格模式,并且函数外部的变量声明会导致出现语法错误:“严格模式下未定义变量”。

"use strict";
function testFunction(){
var testvar = 4;
return testvar;
} // This causes a syntax error.
testvar = 5;

在下面的示例中,仅 testFunction 中的代码处于严格模式。 函数外部的变量声明不会导致语法错误,但函数内部的声明会导致语法错误。

function testFunction(){
"use strict";
// This causes a syntax error.
testvar = 4;
return testvar;
}
testvar = 5;

〉代码在严格模式下受到的限制

语言元素

限制

错误

示例

变量

使用变量,但不未声明它。

SCRIPT5042:严格模式下未定义变量

JavaScript

testvar = 4;

只读属性

写入到只读属性。

SCRIPT5045:严格模式下不允许分配到只读属性

var testObj = Object.defineProperties({}, {
prop1: {
value: 10,
writable: false // by default
},
prop2: {
get: function () {
}
}
});
testObj.prop1 = 20;
testObj.prop2 = 30;

不可扩展的属性

将属性添加到其extensible 属性设置为 false 的对象。

SCRIPT5046:无法为不可扩展的对象创建属性

var testObj = new Object();

Object.preventExtensions(testObj);

testObj.name = "Bob";

delete

删除变量、函数或参数。

删除其configurable 特性设置为 false的属性。

SCRIPT1045:严格模式下不允许对 <表达式> 调用 Delete

var testvar = 15;
function testFunc() {};
delete testvar;
delete testFunc; Object.defineProperty(testObj, "testvar", {
value: 10,
configurable: false
});
delete testObj.testvar;

重复属性

在一个对象文本中多次定义某个属性。

SCRIPT1046:严格模式下不允许一个属性有多个定义

var testObj = {
prop1: 10,
prop2: 15,
prop1: 20
};

重复参数名

在一个函数中多次使用某个参数名。

SCRIPT1038:严格模式下不允许正式参数名称重复

function testFunc(param1, param1) {
return 1;
};

未来保留关键字

将未来保留关键字用作变量或函数名。

SCRIPT1050:无法使用标识符的未来保留字。 严格模式下将保留标识符名称。

  • implements

  • interface

  • let

  • package

  • private

  • protected

  • public

  • static

  • yield

八进制数

对数值文本分配八进制值,或尝试对八进制值使用转义。

SCRIPT1039:严格模式下不允许使用八进制数字参数和转义字符

var testoctal = 010;
var testescape = \010;

this

当 this 的值为null 或undefined 时,该值不会转换为全局对象。

 
function testFunc() {
return this;
}
var testvar = testFunc();

在非严格模式下,testvar 的值为全局对象,但在严格模式下,该值为 undefined。

作为标识符的eval

字符串“eval”不能用作标识符(变量或函数名、参数名等)。

 
var eval = 10;

语句或块中声明的函数

无法在语句或块中声明函数。

SCRIPT1047:在严格模式下,函数声明无法嵌套在语句或块中。它们只能显示在顶级或直接显示在函数体中。

var arr = [1, 2, 3, 4, 5];
var index = null;
for (index in arr) {
function myFunc() {};
}

eval 函数内声明的变量

如果在 eval 函数内声明变量,则不能在此函数外部使用该变量。

SCRIPT1041:严格模式下“eval”的用法无效

eval("var testvar = 10");
testvar = 15;

虽然允许间接计算,但您仍无法使用在 eval 函数外部声明的变量。

var indirectEval = eval;
indirectEval("var testvar = 10;");
document.write(testVar);

此代码会导致错误 SCRIPT5009:“testVar”未定义。

作为标识符的Arguments

字符串“arguments”不能用作标识符(变量或函数名、参数名等)。

SCRIPT1042:严格模式下“arguments”的用法无效

var arguments = 10;

函数内的arguments

不能更改本地arguments 对象的成员的值。

 
function testArgs(oneArg) {
arguments[0] = 20;
}

在非严格模式下,可以通过更改 arguments[0] 的值来更改oneArg 参数的值,从而使 oneArg 和 arguments[0] 的值都为 20。 在严格模式下,更改 arguments[0] 的值不会影响oneArg 的值,因为 arguments 对象只是一个本地副本。

arguments.callee

不允许。

 
function (testInt) {
if (testInt-- == 0)
return;
arguments.callee(testInt--);
}

with

不允许。

SCRIPT1037:严格模式下不允许使用“with”语句

with (Math){
x = cos(3);
y = tan(7);
}

http://msdn.microsoft.com/zh-cn/library/windows/apps/br230269.aspx

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

  1. 设计模式-发布订阅模式(javaScript)

    1. 前言 2. 什么是发布订阅模式 3. 发布订阅优缺点 4. 举例 4. 总结 1. 前言 发布订阅者模式是为了发布者和订阅者之间避免产生依赖关系,发布订阅者之间的订阅关系由一个中介列表来维护.发 ...

  2. 原型模式 -- JavaScript语言的灵魂

    原型模式就是将原型对象指向创建对象的类,使这些类共享原型对象的方法与属性.JS是基于原型链实现对象之间的继承,是对属性或者方法的共享,而不是对属性和方法的复制. // 图片轮播类 var LoopIm ...

  3. 常用的JavaScript模式

    模式是解决或者避免一些问题的方案. 在JavaScript中,会用到一些常用的编码模式.下面就列出了一些常用的JavaScript编码模式,有的模式是为了解决特定的问题,有的则是帮助我们避免一些Jav ...

  4. 《JavaScript模式》第5章 对象创建模式

    @by Ruth92(转载请注明出处) 第5章:对象创建模式 JavaScript 是一种简洁明了的语言,并没有其他语言中经常使用的一些特殊语法特征,如 命名空间.模块.包.私有属性 以及 静态成员 ...

  5. javascript设计模式学习之九——命令模式

    一.命令模式使用场景及定义 命令模式常见的使用场景是:有时候需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道请求的具体操作是什么.此时希望用一种松耦合的方式来设计程序,使得请求的发送者和 ...

  6. 《JavaScript模式》读书笔记

    简介 在软件开发过程中,模式是指一个通用问题的解决方案.一个模式不仅仅是一个可以用来复制粘贴的代码解决方案,更多地是提供了一个更好的实践经验.有用的抽象化表示和解决一类问题的模板. 对象有两大类: 本 ...

  7. 读书笔记之 - javascript 设计模式 - 代理模式

    代理(proxy)是一个对象,它可以用来控制对另一对象的访问.它与另外那个对象实现了同样的接口,并且会把任何方法调用传递给那个对象.另外那个对象通常称为本体.代理可以代替本体被实例化,并使其可被远程访 ...

  8. JavaScript设计模式之构造函数模式

    一.构造函数模式概念 构造函数用于创建特定类型的对象——不仅声明了使用过的对象,构造函数还可以接受参数以便第一次创建对象的时候设置对象的成员值.你可以自定义自己的构造函数,然后在里面声明自定义类型对象 ...

  9. JavaScript设计模式之建造者模式

    一.建造者模式模式概念 建造者模式可以将一个复杂的对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.也就是说如果我们用了建造者模式,那么用户就需要指定需要建造的类型就可以得到它们,而具体 ...

随机推荐

  1. 用C++语言开发Android程序 配置开发环境

    转自:http://www.cnblogs.com/yaotong/p/3622430.html 用C++语言开发Android程序 配置开发环境   如果你是一个C++语言的死忠,你喜欢C++语言到 ...

  2. 十分钟搞懂什么是CGI(转)

    原文:CGI Made Really Easy,在翻译的过程中,我增加了一些我在学习过程中找到的更合适的资料,和自己的一些理解.不能算是严格的翻译文章,应该算是我的看这篇文章的过程的随笔吧. CGI真 ...

  3. [C++基金会]位计算 游戏开发中的应用

    定义的位操作:通俗点说,,位计算是计算机操作二进制整数. 无论整数可以用二的方式来表示进度,不同类型的其长度的整数位的是不一样的.INT8要么char靠8个月2 位表示,INT16或者short是由1 ...

  4. spoj Balanced Numbers(数位dp)

    一个数字是Balanced Numbers,当且仅当组成这个数字的数,奇数出现偶数次,偶数出现奇数次 一下子就相到了三进制状压,数组开小了,一直wa,都不报re, 使用记忆化搜索,dp[i][s] 表 ...

  5. 黑马day07 注册案例(二)

    1依据index.jsp我们首先制定了注册的功能,当点击注册button什么时候.超链接到注册页面.下面是一个注册jsp页 <%@ page language="java" ...

  6. Android四个存储数据的SharedPreferences

    除了SQLite外部数据库.SharedPreferences它是一个轻量级的数据存储,其本质是基于XML文件存储key-value键值数据,通过定期用它来存储一些简单的配置信息.它的存储位置/dat ...

  7. Vb.net/VB 声明API功能父窗口功能

    回想第一次敲房费,他说自己是api函数实现父窗口及其子窗口最小化的功能.现在再次遇到,自己就在思考,能不能继续使用API函数呢?答案当然是Of Course! 事实上细致看两者并没有多大的差别,先看看 ...

  8. Git使用摘要

    svn过渡到git流程.使用我一直git svn场景,对于遇到的一些问题,并经常使用的功能来概括: 1.git svn出口: git svn clone "svn通路" 2.git ...

  9. java中处理字符编码(网页与数据库)(转)

    首先声明一下,此文章时从网上转载的.如下的某些方法是确实管用,但是从中发现了有一点不足,就是原文笔者没考虑使用不同Web Server时出现的情况,比如文章里我用红色字体画出来的部分代码在Tomcat ...

  10. ASP.Net 重写IHttpModule 来拦截 HttpApplication 实现HTML资源压缩和空白过滤

    务实直接上代码: 1. 重写FilterModule.cs using System; using System.Collections.Generic; using System.Linq; usi ...