严格模式 (JavaScript)
严格模式是一种将更好的错误检查引入代码中的方法。 在使用严格模式时,您无法使用隐式声明的变量、将值赋给只读属性或将属性添加到不可扩展的对象。
〉声明严格模式
可以通过在文件、程序或函数的开头添加 "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({}, {
|
|
不可扩展的属性 |
将属性添加到其extensible 属性设置为 false 的对象。 |
SCRIPT5046:无法为不可扩展的对象创建属性 |
var testObj = new Object(); Object.preventExtensions(testObj); testObj.name = "Bob"; |
|
delete |
删除变量、函数或参数。 删除其configurable 特性设置为 false的属性。 |
SCRIPT1045:严格模式下不允许对 <表达式> 调用 Delete |
var testvar = 15; |
|
重复属性 |
在一个对象文本中多次定义某个属性。 |
SCRIPT1046:严格模式下不允许一个属性有多个定义 |
var testObj = {
|
|
重复参数名 |
在一个函数中多次使用某个参数名。 |
SCRIPT1038:严格模式下不允许正式参数名称重复 |
function testFunc(param1, param1) {
|
|
未来保留关键字 |
将未来保留关键字用作变量或函数名。 |
SCRIPT1050:无法使用标识符的未来保留字。 严格模式下将保留标识符名称。 |
|
|
八进制数 |
对数值文本分配八进制值,或尝试对八进制值使用转义。 |
SCRIPT1039:严格模式下不允许使用八进制数字参数和转义字符 |
var testoctal = 010; |
|
this |
当 this 的值为null 或undefined 时,该值不会转换为全局对象。 |
function testFunc() {
在非严格模式下,testvar 的值为全局对象,但在严格模式下,该值为 undefined。 |
|
|
作为标识符的eval |
字符串“eval”不能用作标识符(变量或函数名、参数名等)。 |
var eval = 10; |
|
|
语句或块中声明的函数 |
无法在语句或块中声明函数。 |
SCRIPT1047:在严格模式下,函数声明无法嵌套在语句或块中。它们只能显示在顶级或直接显示在函数体中。 |
var arr = [1, 2, 3, 4, 5]; |
|
eval 函数内声明的变量 |
如果在 eval 函数内声明变量,则不能在此函数外部使用该变量。 |
SCRIPT1041:严格模式下“eval”的用法无效 |
eval("var testvar = 10");
虽然允许间接计算,但您仍无法使用在 eval 函数外部声明的变量。 var indirectEval = eval; 此代码会导致错误 SCRIPT5009:“testVar”未定义。 |
|
作为标识符的Arguments |
字符串“arguments”不能用作标识符(变量或函数名、参数名等)。 |
SCRIPT1042:严格模式下“arguments”的用法无效 |
var arguments = 10; |
|
函数内的arguments |
不能更改本地arguments 对象的成员的值。 |
function testArgs(oneArg) {
在非严格模式下,可以通过更改 arguments[0] 的值来更改oneArg 参数的值,从而使 oneArg 和 arguments[0] 的值都为 20。 在严格模式下,更改 arguments[0] 的值不会影响oneArg 的值,因为 arguments 对象只是一个本地副本。 |
|
|
arguments.callee |
不允许。 |
function (testInt) {
|
|
|
with |
不允许。 |
SCRIPT1037:严格模式下不允许使用“with”语句 |
with (Math){
|
http://msdn.microsoft.com/zh-cn/library/windows/apps/br230269.aspx
严格模式 (JavaScript)的更多相关文章
- 设计模式-发布订阅模式(javaScript)
1. 前言 2. 什么是发布订阅模式 3. 发布订阅优缺点 4. 举例 4. 总结 1. 前言 发布订阅者模式是为了发布者和订阅者之间避免产生依赖关系,发布订阅者之间的订阅关系由一个中介列表来维护.发 ...
- 原型模式 -- JavaScript语言的灵魂
原型模式就是将原型对象指向创建对象的类,使这些类共享原型对象的方法与属性.JS是基于原型链实现对象之间的继承,是对属性或者方法的共享,而不是对属性和方法的复制. // 图片轮播类 var LoopIm ...
- 常用的JavaScript模式
模式是解决或者避免一些问题的方案. 在JavaScript中,会用到一些常用的编码模式.下面就列出了一些常用的JavaScript编码模式,有的模式是为了解决特定的问题,有的则是帮助我们避免一些Jav ...
- 《JavaScript模式》第5章 对象创建模式
@by Ruth92(转载请注明出处) 第5章:对象创建模式 JavaScript 是一种简洁明了的语言,并没有其他语言中经常使用的一些特殊语法特征,如 命名空间.模块.包.私有属性 以及 静态成员 ...
- javascript设计模式学习之九——命令模式
一.命令模式使用场景及定义 命令模式常见的使用场景是:有时候需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道请求的具体操作是什么.此时希望用一种松耦合的方式来设计程序,使得请求的发送者和 ...
- 《JavaScript模式》读书笔记
简介 在软件开发过程中,模式是指一个通用问题的解决方案.一个模式不仅仅是一个可以用来复制粘贴的代码解决方案,更多地是提供了一个更好的实践经验.有用的抽象化表示和解决一类问题的模板. 对象有两大类: 本 ...
- 读书笔记之 - javascript 设计模式 - 代理模式
代理(proxy)是一个对象,它可以用来控制对另一对象的访问.它与另外那个对象实现了同样的接口,并且会把任何方法调用传递给那个对象.另外那个对象通常称为本体.代理可以代替本体被实例化,并使其可被远程访 ...
- JavaScript设计模式之构造函数模式
一.构造函数模式概念 构造函数用于创建特定类型的对象——不仅声明了使用过的对象,构造函数还可以接受参数以便第一次创建对象的时候设置对象的成员值.你可以自定义自己的构造函数,然后在里面声明自定义类型对象 ...
- JavaScript设计模式之建造者模式
一.建造者模式模式概念 建造者模式可以将一个复杂的对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.也就是说如果我们用了建造者模式,那么用户就需要指定需要建造的类型就可以得到它们,而具体 ...
随机推荐
- Java equals 和 hashcode 方法
问题 面试时经常会问起字符串比较相关的问题, 总结一下,大体是如下几个: 1.字符串比较时用的什么方法,内部实现如何? 2.hashcode的作用,以及重写equal方法,为什么要重写hashcode ...
- Troubleshooting "Global Enqueue Services Deadlock detected" (Doc ID 1443482.1)
In this Document _afrLoop=1021148011984950&id=1443482.1&displayIndex=1&_afrWindowMode= ...
- lightoj1027(期望dp)
有一个迷宫,有n个门,走每个的概率都是相同的 每个门有一个数字,如果是正数ai,那么表示走ai天就能走出迷宫,如果是负数,那么走-ai天会回到原地,然后会忘记之前的事情,继续选择门去走 所以,如果都是 ...
- 飘逸的python - 发送带各种类型附件的邮件
上一篇博文演示了如何发送简单的邮件,这一篇将演示如何发送各种类型的附件. 基本思路就是,使用MIMEMultipart来标示这个邮件是多个部分组成的,然后attach各个部分.如果是附件,则add_h ...
- Xamarin 手动安装步骤+破解
原文:Xamarin 手动安装步骤+破解 由于Xamarin运行的时候有很多依赖项,所以现在在官网上下载的XamarinInstall只是一个下载安装器,并不是软件包.它会自动下载安装所需的依赖软件, ...
- Android---App Widget(五)
尺寸调整指南 当一个Widget被锁屏所持有时,Android框架会忽略minWidth.minHeight.minResizeWidth和minResizeHeight属性字段.如果该Widget同 ...
- MFC漆摘要-截图,获得DIB/DDB图形Pixel
1. 当前Screen进行Copy屏幕,获得BITMAP 当前屏幕Copy.须要获取当前屏幕的HDC, 一种是直接从屏幕DC抓原始图. 一种是然后使用兼容MemDC进行抓图,然后能够附加图 ...
- AC自己主动机 总结
模板--参考六如家培训指南 /*===============================*\ 依照训练指南写的 \*===============================*/ #incl ...
- MapReduce(十五): 从HDFS阅读本文的源代码分析
以Map任务读取文本数据为例: 1) LineRecordReader负责对文件切割的定位,以及对读取每一行内容的封装供用户Map任务使用.每次在定位在文件里不为0的位置时,多读取一行,由于前一个 ...
- 两个文件中的配置项设置方法和C比较程序处理
在实际的软件开发项目.程序经常需要翻阅了一些资料可能会改变从外部,我们需要读出的信息到一个统一的文件(一般ini档),而此文件被称为个人资料. 考虑这样一个场景,程序须要与多个数据库打交道,要从配置文 ...