严格模式 (JavaScript)

 

严格模式是一种将更好的错误检查引入代码中的方法。 在使用严格模式时,你无法使用隐式声明的变量、将值赋给只读属性或将属性添加到不可扩展的对象等。 本主题后面的代码在严格模式下受到的限制部分列出了相关限制。 有关严格模式的更多信息,请参见 ECMAScript 语言规范版本 5

 警告

Internet Explorer 10 之前的 Internet Explorer 版本不支持严格模式。

可以通过在文件、程序或函数的开头添加 "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:严格模式下未定义变量

 
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

  • 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/br230269(v=vs.94).aspx

高级javascript---严格模式的更多相关文章

  1. (转)深入理解JavaScript 模块模式

    深入理解JavaScript 模块模式 (原文)http://www.cnblogs.com/starweb/archive/2013/02/17/2914023.html 英文:http://www ...

  2. 深入理解JavaScript 模块模式

    http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html 模块模式是JavaScript一种常用的编码模式.这是一般的 ...

  3. javascript运行模式:并发模型 与Event Loop

    看了阮一峰老师的JavaScript 运行机制详解:再谈Event Loop和[朴灵评注]的文章,查阅网上相关资料,把自己对javascript运行模式和EVENT loop的理解整理下,不一定对,日 ...

  4. Javascript原型模式总结梳理

    在大多数面向对象语言中,对象总是由类中实例化而来,类和对象的关系就像模具跟模件一样.Javascript中没有类的概念,就算ES6中引入的class也不过是一种语法糖,本质上还是利用原型实现.在原型编 ...

  5. JavaScript严格模式详解

    转载自阮一峰的博客 Javascript 严格模式详解   作者: 阮一峰 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict m ...

  6. JavaScript严谨模式(Strict Mode)

    下面的内容翻译自It’s time to start using JavaScript strict mode,作者Nicholas C.Zakas参与了YUI框架的开发,并撰写了多本前端技术书籍,在 ...

  7. Javascript编程模式(JavaScript Programming Patterns)Part 1.(初级篇)

    JavaScript 为网站添加状态,这些状态可能是校验或者更复杂的行为像拖拽终止功能或者是异步的请求webserver (aka Ajax). 在过去的那些年里, JavaScript librar ...

  8. (" use strict")Javascript 严格模式详解

    Javascript 严格模式详解 转载别人的博客内容,浏览了一遍,没有全部吸收,先保存一下链接 http://www.ruanyifeng.com/blog/2013/01/javascript_s ...

  9. JQuery日记6.5 Javascript异步模式(一)

    理解力JQuery前实现异步队列,有必要理解javascript异步模式. Javascript异步其实并不严重格异步感,js使某些片段异步方式在将来运行,流不必等待继续向下进行. 在多线程的语言中最 ...

随机推荐

  1. 关于Hibernate的Dialect

    org.hibernate HibernateException Dialect must be explicitly set :***  使用Hibernate,有时候会遇到类似上面的异常.  使用 ...

  2. vue.js的基本操作

    1.{{message}}输出data数据中的message. 2.v-for="todo in todos"输出data数据中的dotos数组 3.v-on:click=&quo ...

  3. VS上关于找不到程序集的问题

    第一次重新装了次vs再次导入以前写的项目发现找不到程序集,出现很多的警告和错误,并且代码里好多都是显示红色的 第二次乱动了下又出现此问题 记录下解决的方案和一些相关的问题方案 1.引用一个DLL,需要 ...

  4. 2016huasacm暑假集训训练五 F - Monkey Banana Problem

    题目链接:http://acm.hust.edu.cn/vjudge/contest/126708#problem/F 题意:求至上而下一条路径的所经过的值得和最大值,这题比赛时就出了 但当时看不懂题 ...

  5. 学习 React(jsx语法) + es2015 + babel + webpack

    视频学习地址: http://www.jtthink.com/course/play/575 官方地址 https://facebook.github.io/react/ 神坑: 1.每次this.s ...

  6. java接口中定义成员变量

    //抽象类中可以定义如下成员变量:public abstract class People { public String name; public int age; public abstract ...

  7. dev GridControl 根据鼠标坐标 选中行

    if (e.Button == System.Windows.Forms.MouseButtons.Right) { DevExpress.XtraGrid.Views.Grid.ViewInfo.G ...

  8. 最近碰到的一些 SSL 问题记录

    最近碰到一些 SSL 的小问题,特记录下. 我们有个 Java 实现的 SSL TCP 服务端,为客户端(PC.Android 和 iOS)提供 SSL 接入连接服务.最近有用户反馈其手机上 App ...

  9. 细嗅Promise

    读完这篇文章,预计会消耗你 40 分钟的时间. Ajax 出现的时候,刮来了一阵异步之风,现在 Nodejs 火爆,又一阵异步狂风刮了过来.需求是越来越苛刻,用户对性能的要求也是越来越高,随之而来的是 ...

  10. CSharpGL(2)设计和使用场景元素及常用接口

    CSharpGL(2)设计和使用场景元素及常用接口 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入 ...