严格模式 (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. 1001. A+B Format (20)

    原题连接:https://www.patest.cn/contests/pat-a-practise/1001 题目如下: Calculate a + b and output the sum in ...

  2. *HDU1846HDU2188 巴什博奕

    Brave Game Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. 推荐几个Android自定义的进度条(转载)

    CustomLoading ElasticDownload Circle-Progress-View lzyzsdCircleProgress SquareProgressBar materialis ...

  4. Window.focus()让页面成为当前窗体

    Window.focus()让页面成为当前窗体 最近在弄在线客服的时候,想在收到信息时候让窗体自动弹出到最前,最小化的时候也是弹出到最前.本来以为很麻烦,问了好多人,都不知道,在网上查资料也没有查到. ...

  5. 在excel worksheet中添加button 和对Excel workbook做权限控制相关的新知识

    添加button在worksheet中 1. Shapes Object (Excel) Reference:http://technet.microsoft.com/zh-cn/library/ff ...

  6. ReactJS入门(四)—— 组件API

    本篇将介绍 React 组件的API,其中主要的几个API我们在第一篇的时候便已介绍过,这里可以做个温故知新. 本篇的代码你也可以在我的Github上获取到. setState 参数: nextSta ...

  7. 探索C#之微型MapReduce

    MapReduce近几年比较热的分布式计算编程模型,以C#为例简单介绍下MapReduce分布式计算. 阅读目录 背景 Map实现 Reduce实现 支持分布式 总结 背景 某平行世界程序猿小张接到B ...

  8. [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能

    [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ...

  9. Mysql 主从延时监控

    200 ? "200px" : this.width)!important;} --> 介绍 主从延时在主从环境中是一个非常值得关注的问题,有时候我们可以通过show sla ...

  10. 一个Java程序员的实习总结(2)

    在今天的总结里,主要讲述第二.三周这半个月的培训情况,并且穿插讲讲我对实习和见习的看法,有需要有兴趣的童鞋可以看看. 半个月的见习 其实我更愿意把实习和见习分开讲,实习指的是还没签三方或者直接就是大三 ...