严格模式(Strict Mode)是ECMAScript 5的新特性,它允许你把整个程序,或者某个函数,放置在“严格”的操作语境中。这种严格的语境会防止某些特定的操作并抛出更多的异常。

虽然ECMAScript 5对ECMAScript 3是向下兼容的,但是在严格模式下,所有在ECMAScript 3中不赞成使用的特性都被禁用(或抛出错误)而不是兼容。

支持严格模式的浏览器:Firefox 5+、IE9、Chrome

启用严格模式有以下好处:

  • 捕获一些编程错误,并抛出异常。
  • 阻止进行一些相对“不安全”的操作(例如访问全局变量),抛出异常。
  • 禁用一些让人迷惑的特性。

关于严格模式的大多数信息都可以在http://es5.github.com/#x4.3.6中找到。

  • 如何启用严格模式

在程序的开头添加这条语句即可对整段脚本启用严格模式:

'use strict';

也可以只在函数的内部启用严格模式,这样不会影响到外部:

function imStrict() {   'use strict';   // ... your code ... }

启用严格模式的语句只是一段普通的字符串“use strict”,没有任何新语法。这意味着不会对就旧式浏览器造成任何负面影响。

在函数内部启用严格模式的一个实际应用是,把整个Javascript类库定义在严格模式的函数内部,这样就可以不影响外部的代码:

// Non-strict code...
(function(){   "use strict";
  // Define your library strictly... })();
// Non-strict code...

启用了严格模式后,不赞成的特性将的控制台中提示错误。

开启严格模式后,以下操作将会提示错误:

  • 变量和属性

对未定义变量的赋值将会失败,而不是把这个变量作为全局变量。

写入一个可写特性为false的属性,删除一个可配置特性为false的属性,或者添加一个可扩展特性为false的属性,都会导致错误(这些特性是预先商定好的)。过去,这些操作不会抛出异常,仅仅是静默地失败。

对变量、函数或者函数参数执行delete操作会导致错误。

var foo = 'test'; function test() { }
delete foo; // Error delete test; // Error
function test2(arg) {   delete arg; // Error }

在一个对象容器内部定义相同属性会导致异常的抛出

// Error { foo: true, foo: false }

8进制数字表示被制止, 010 不再表示 8,而是提示不支持八进制字面量的语法错误

eval

道格拉斯曾说:“Eval是魔鬼”。Eval是非常灵活的条件元素,但是它也是一个大问题。从开始用它,如果广泛的使用,你的规则将变得不可读。同样,因为你可以在Eval中做几乎任何事情,引擎无法对它做任何假设,因此也很难提供任何优化。因此,任何对“eval”这个名字的使用(主要意图是把eval函数指向一个变量或者是对象的属性)都是禁止的。

// All generate errors... obj.eval = ... obj.foo = eval; var eval = ...; for ( var eval in ... ) {} function eval(){} function test(eval){} function(eval){} new Function("eval")

另外,通过eval声明新变量也会无效:

eval("var a = false;"); print( typeof a ); // undefined

  • 函数

重写arguments对象会导致错误

arguments = [...]; // not allowed

定义同名参数(function(foo, foo) { })会导致错误。

对arguments.caller和arguments.callee的访问会抛出异常。因此,任何需要用到的匿名函数都必须先命名,例如:

setTimeout(function later(){   // do stuff...   setTimeout( later, 1000 ); }, 1000 );

函数的arguments、caller和callee属性不再存在,定义它们的操作也是禁止的

function test() { } test.caller = 'caller';  // Error

最后,一个长期存在(且非常讨厌)的BUG已经被解决了:当使用null或者undefined作为Function.prototype.call或 Function.prototype.apply方法的第一个参数时,函数内部的this将会指向全局对象。而严格模式将会阻止其执行并抛出异常:

(function(){ ... }).call(null); // Exception

函数声明只能在top level 或者直接出现在其他函数中

下面这段代码将输出几?

var a = 1;

if(a == 1){

function fn(){alert(1);}

}else{

function fn(){alert(2);}

}

fn();

结果是2,在严格模式下不允许这样声明函数

with() { }

with() { }语句一直被认为是万恶之源,在严格模式下完全禁止使用该语句。

转载于:https://www.cnblogs.com/earlyup/archive/2012/02/03/2337084.html

使用ECMAScript 5严格模式提升开发效率相关推荐

  1. Atitit外包优缺点 提升开发效率 外包模式 1.一般来说外包优点 1.1.更加方便快捷 时间成本降低了 1.2.会导致 经济成本高,,时间成本降低了, 2.缺点 2.1.成本高 2.2.

    Atitit外包优缺点  提升开发效率 外包模式 一般来说外包优点 更加方便快捷  时间成本降低了 会导致 经济成本高,,时间成本降低了, 缺点 成本高 缺少控制 但是少部分,比如理发,经济时间成本都 ...

  2. Python学习笔记:Day13 提升开发效率

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  3. 深度解读Microsoft Build 2020:提升开发效率,优化开发环境

    Microsoft Build 2020 在众多新产品与技术发布中圆满落幕 但身为开发技术人深知 技术世界的更迭.求索却从未止步 唯有不断提升自身技能栈创新 方能从技术浮沉中获得更多养分 让技术予力世 ...

  4. 提升开发效率的十个工具

    Git 之前也有过不少版本控制的工具.有好的,也有糟糕的.不过它们都或多或少地误入歧途了. 这时候Git出现了.一旦你用上了这个神奇的工具,很难相像你还会碰到比它更好的了. 还没用过Git?试一下吧. ...

  5. order by 影响效率么_提升开发效率N倍的20+命令行神器

    图 by:石头@青海湖 关于作者:程序猿石头(ID: tangleithu),现任阿里巴巴技术专家,清华学渣,前大疆后端 Leader.以每篇文章都让人有收获为目的,欢迎关注,交流和指导! 背景 本文 ...

  6. atitit.提升开发效率---mda 软件开发方式的革命

    atitit.提升开发效率---mda 软件开发方式的革命 1. 软件开发方式的革命开发工具的抽象层次将再次提升 1 2. 应用框架和其实现相分离 2 3. 目前的问题模型和代码不同步 2 4. MD ...

  7. atitit.提升开发效率---使用server控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比較...

    atitit.提升开发效率---使用server控件生命周期  asp.net 11个阶段  java jsf 的6个阶段比較 例如以下列举了server控件生命周期所要经历的11个阶段. (1)初始 ...

  8. 猿创征文|后端开发工程师提升开发效率神器推荐

    简介 对于现在的后端工程师来说,并不仅仅局限于编写代码和解决bug,这两个要素了.如果你目前还只是忙碌的写代码和改bug的话,那要深度思考一下,我为什么日复一日的写这些重复代码?这样有何意义?或者说, ...

  9. 对提升开发效率的总结

    做软件开发好几年了,总结下开发经验. 如何提升开发效率: 1.扎实的技术功底 2.强大的学习理解能力 3.丰富的处理经验 4.业务与需求的理解度 扎实的技术功底自然是作为一名优秀的开发人员必不可少的, ...

  10. idea从零到精通08之IDEA常用插件、提升开发效率

    文章目录 作者简介 引言 导航 热门专栏推荐 概述 一.插件安装方式 二.在Idea中无法直接安装插件 三.常用插件 1.ECTranslation 2.Grep Console 3.CodeGlan ...

最新文章

  1. 国产WEB漏洞测试平台——MST
  2. 时序分析:HMM模型(状态空间)
  3. SLAM研究内容框架分析
  4. Redis分布式锁问题
  5. Android5.1/7.1 Selinux JNI访问新增/dev/xxx设备节点
  6. dcrs 端口配ip_DCRS-5950配置(划分VLAN,根据每个VLAN通过DHCP分配IP地址)
  7. poj3414 Pots
  8. 实验3matlab的符号运算,实验3 Matlab 符号运算及求函数极值
  9. 解决全网 99的视频下载问题
  10. X509证书基本概念
  11. SpringBoot实现接口签名防止篡改(V2)
  12. excel数组公式中的意想不到的坑
  13. Vue3中关于getCurrentInstance的大坑
  14. java集成阿里大于第三方平台发送短信验证码
  15. 微型计算机AL和AH区别,微型计算机的技术与应用.ppt
  16. 【替代XShell】WindTerm 工具 【免费】【开源】
  17. 论文浅尝 | DI刊发的那些有关Knowledge Graph的论文
  18. English Learning - L2-3 英音地道语音语调 小元音 [ʌ] [ɒ] [ʊ] [ɪ] [ə] [e] 2023.02.27 周一
  19. 基于开源大模型Vicuna-13B构建私有制库问答系统
  20. 开放麒麟openKylin 0.7.5版本升级

热门文章

  1. 【NLP】语义角色标注(Semantic Role Labelling)
  2. 数据预处理与特征工程—11.分层采样
  3. 白板推导系列Pytorch-隐马尔可夫模型-学习问题
  4. 秒懂商用区块链关键技术:智能合约
  5. 经典视觉SLAM框架
  6. 以拯救之因 强制恢复导致ORA-600 4000错误案例
  7. 06向量及其坐标表示、向量的方向角与方向余弦、向量组共线与共面的条件、向量的加法与数乘运算、向量组的线性组合、二维向量的基向量分解、三维向量的基向量分解、用坐标做向量的数乘
  8. Python与C:指针与按址传递
  9. php解密 hr+c_PHP每15分钟自动更新网站地图(减少服务器消耗)
  10. linux跟踪线程,linux跟踪线程的方法:LWP和strace命令