使用ECMAScript 5严格模式提升开发效率
严格模式(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严格模式提升开发效率相关推荐
- Atitit外包优缺点 提升开发效率 外包模式 1.一般来说外包优点 1.1.更加方便快捷 时间成本降低了 1.2.会导致 经济成本高,,时间成本降低了, 2.缺点 2.1.成本高 2.2.
Atitit外包优缺点 提升开发效率 外包模式 一般来说外包优点 更加方便快捷 时间成本降低了 会导致 经济成本高,,时间成本降低了, 缺点 成本高 缺少控制 但是少部分,比如理发,经济时间成本都 ...
- Python学习笔记:Day13 提升开发效率
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- 深度解读Microsoft Build 2020:提升开发效率,优化开发环境
Microsoft Build 2020 在众多新产品与技术发布中圆满落幕 但身为开发技术人深知 技术世界的更迭.求索却从未止步 唯有不断提升自身技能栈创新 方能从技术浮沉中获得更多养分 让技术予力世 ...
- 提升开发效率的十个工具
Git 之前也有过不少版本控制的工具.有好的,也有糟糕的.不过它们都或多或少地误入歧途了. 这时候Git出现了.一旦你用上了这个神奇的工具,很难相像你还会碰到比它更好的了. 还没用过Git?试一下吧. ...
- order by 影响效率么_提升开发效率N倍的20+命令行神器
图 by:石头@青海湖 关于作者:程序猿石头(ID: tangleithu),现任阿里巴巴技术专家,清华学渣,前大疆后端 Leader.以每篇文章都让人有收获为目的,欢迎关注,交流和指导! 背景 本文 ...
- atitit.提升开发效率---mda 软件开发方式的革命
atitit.提升开发效率---mda 软件开发方式的革命 1. 软件开发方式的革命开发工具的抽象层次将再次提升 1 2. 应用框架和其实现相分离 2 3. 目前的问题模型和代码不同步 2 4. MD ...
- atitit.提升开发效率---使用server控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比較...
atitit.提升开发效率---使用server控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比較 例如以下列举了server控件生命周期所要经历的11个阶段. (1)初始 ...
- 猿创征文|后端开发工程师提升开发效率神器推荐
简介 对于现在的后端工程师来说,并不仅仅局限于编写代码和解决bug,这两个要素了.如果你目前还只是忙碌的写代码和改bug的话,那要深度思考一下,我为什么日复一日的写这些重复代码?这样有何意义?或者说, ...
- 对提升开发效率的总结
做软件开发好几年了,总结下开发经验. 如何提升开发效率: 1.扎实的技术功底 2.强大的学习理解能力 3.丰富的处理经验 4.业务与需求的理解度 扎实的技术功底自然是作为一名优秀的开发人员必不可少的, ...
- idea从零到精通08之IDEA常用插件、提升开发效率
文章目录 作者简介 引言 导航 热门专栏推荐 概述 一.插件安装方式 二.在Idea中无法直接安装插件 三.常用插件 1.ECTranslation 2.Grep Console 3.CodeGlan ...
最新文章
- 国产WEB漏洞测试平台——MST
- 时序分析:HMM模型(状态空间)
- SLAM研究内容框架分析
- Redis分布式锁问题
- Android5.1/7.1 Selinux JNI访问新增/dev/xxx设备节点
- dcrs 端口配ip_DCRS-5950配置(划分VLAN,根据每个VLAN通过DHCP分配IP地址)
- poj3414 Pots
- 实验3matlab的符号运算,实验3 Matlab 符号运算及求函数极值
- 解决全网 99的视频下载问题
- X509证书基本概念
- SpringBoot实现接口签名防止篡改(V2)
- excel数组公式中的意想不到的坑
- Vue3中关于getCurrentInstance的大坑
- java集成阿里大于第三方平台发送短信验证码
- 微型计算机AL和AH区别,微型计算机的技术与应用.ppt
- 【替代XShell】WindTerm 工具 【免费】【开源】
- 论文浅尝 | DI刊发的那些有关Knowledge Graph的论文
- English Learning - L2-3 英音地道语音语调 小元音 [ʌ] [ɒ] [ʊ] [ɪ] [ə] [e] 2023.02.27 周一
- 基于开源大模型Vicuna-13B构建私有制库问答系统
- 开放麒麟openKylin 0.7.5版本升级
热门文章
- 【NLP】语义角色标注(Semantic Role Labelling)
- 数据预处理与特征工程—11.分层采样
- 白板推导系列Pytorch-隐马尔可夫模型-学习问题
- 秒懂商用区块链关键技术:智能合约
- 经典视觉SLAM框架
- 以拯救之因 强制恢复导致ORA-600 4000错误案例
- 06向量及其坐标表示、向量的方向角与方向余弦、向量组共线与共面的条件、向量的加法与数乘运算、向量组的线性组合、二维向量的基向量分解、三维向量的基向量分解、用坐标做向量的数乘
- Python与C:指针与按址传递
- php解密 hr+c_PHP每15分钟自动更新网站地图(减少服务器消耗)
- linux跟踪线程,linux跟踪线程的方法:LWP和strace命令