严格模式 (JavaScript)

 

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

 警告

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

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

 
  1. "use strict";
  2. function testFunction(){
  3. var testvar = 4;
  4. return testvar;
  5. }
  6.  
  7. // This causes a syntax error.
  8. testvar = 5;

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

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

下表列出了严格模式下适用的最重要的限制。

 

语言元素

限制

错误

示例

变量

使用变量但不声明。

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

 
  1. testvar = 4;

只读属性

写入到只读属性。

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

 
  1. var testObj = Object.defineProperties({}, {
  2. prop1: {
  3. value: 10,
  4. writable: false // by default
  5. },
  6. prop2: {
  7. get: function () {
  8. }
  9. }
  10. });
  11. testObj.prop1 = 20;
  12. testObj.prop2 = 30;

不可扩展的属性

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

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

 
  1. var testObj = new Object();
  2.  
  3. Object.preventExtensions(testObj);
  4.  
  5. testObj.name = "Bob";

delete

删除变量、函数或参数。

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

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

 
  1. var testvar = 15;
  2. function testFunc() {};
  3. delete testvar;
  4. delete testFunc;
  5.  
  6. Object.defineProperty(testObj, "testvar", {
  7. value: 10,
  8. configurable: false
  9. });
  10. delete testObj.testvar;

重复属性

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

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

 
  1. var testObj = {
  2. prop1: 10,
  3. prop2: 15,
  4. prop1: 20
  5. };

重复参数名

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

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

 
  1. function testFunc(param1, param1) {
  2. return 1;
  3. };

未来保留关键字

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

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

  • implements

  • interface

  • package

  • private

  • protected

  • public

  • static

  • yield

八进制数

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

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

 
  1. var testoctal = 010;
  2. var testescape = \010;

this

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

 
 
  1. function testFunc() {
  2. return this;
  3. }
  4. var testvar = testFunc();

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

作为标识符的 eval

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

 
 
  1. var eval = 10;

语句或块中声明的函数

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

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

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

eval 函数内声明的变量

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

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

 
  1. eval("var testvar = 10");
  2. testvar = 15;

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

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

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

作为标识符的Arguments

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

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

 
  1. var arguments = 10;

函数内的arguments

无法更改本地arguments 对象的成员的值。

 
 
  1. function testArgs(oneArg) {
  2. arguments[0] = 20;
  3. }

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

arguments.callee

不允许。

 
 
  1. function (testInt) {
  2. if (testInt-- == 0)
  3. return;
  4. arguments.callee(testInt--);
  5. }

with

不允许。

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

 
  1. with (Math){
  2. x = cos(3);
  3. y = tan(7);
  4. }

资源出处: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. ViewController的生命周期

    # ViewController 的生命周期 # ViewController的生命周期中各个方法的流程如下: init loadView :加载view viewDidLoad :view加载完毕 ...

  2. MemCache 启动

    这个MemCache在园子里面的文章也很多,这里只是我自己记录作下笔记 MemCache的官方网站为http://memcached.org/ 启动与关闭memCache # /usr/local/m ...

  3. Tomcat7安装配置 for Ubuntu

    一.环境说明: 操作系统:Ubuntu 12.04.2 LTS Tomcat:apache-tomcat-7.0.52 二.下载 下载地址:http://tomcat.apache.org/ 这里下载 ...

  4. (学)解决诡异的 Exception type: SocketException 127.0.0.1:80

    许久不发博了,老杨听完故事让我持续写一下“十万个为什么” 一.背景:  昨天我们亲密的战友HH刘老板亲临现场,指出我们协用的一个项目,客户方面反馈手持终端系统不定期“卡死”,要我们安排人飞到广州驻场解 ...

  5. jquery 回到顶部,简洁大方

    效果

  6. php 图片上传的公共方法(按图片宽高缩放或原图)

    写的用于图片上传的公共方法类调用方法: $upload_name='pic';$type = 'logo_val';$file_name = 'logo_' . $user_id .create_st ...

  7. spring-data-jpa 方法名关键字的命名规范

  8. 更加精确的定时器:dispatch_source_t

    在使用定时器时,我们经常使用NSTimer,但是由于NSTimer会受RunLoop影响,当RunLoop处理的任务很多时,就会导致NSTimer的精度降低,所以在一些对定时器精度要求很高的情况下,应 ...

  9. eclipse构建maven的web项目

    如果以后要创建maven的web项目,可以参考这个链接 http://blog.csdn.net/smilevt/article/details/8215558/

  10. 性能计数器与profiler的组合性能诊断

    性能计数器和sql profiler都是常用的性能诊断工具和优化工具,最近和群友聊天发现很多人竟然不知道这两个可以“组合”使用,所以这篇算是一篇扫盲贴吧. 两种工具简述 通过计数器可以收集两部分内容: ...