当前位置: 首页 > 编程日记 > 正文

是时候开始使用JavaScript严格模式了怎样启用javascri

E是时候开始使用JavaScript严格模式了怎样启用javascriCMAScript5将严格模式(strictmode)引入了Javascript中,目的是允许开发人员能够选择“更好”的Javascript版本,这个版本能用不同的方式处理那些普遍而又臭名昭著的错误。一开始的时候,我对该模式抱着怀疑的态度,因为当时在只有一款浏览器(Firefox)支持严格模式。时至今日,所有的主流浏览器的最新版本——包括IE10与Opera12——都支持严格模式。使用严格模式的时机已经成熟了。

AD:

ECMAScript5将严格模式(strictmode)引入了Javascript中,目的是允许开发人员能够选择“更好”的Javascript版本,这个版本能用不同的方式处理那些普遍而又臭名昭著的错误。一开始的时候,我对该模式抱着怀疑的态度,因为当时在只有一款浏览器(Firefox)支持严格模式。时至今日,所有的主流浏览器的最新版本——包括IE10与Opera12——都支持严格模式。使用严格模式的时机已经成熟了。

它带来了什么?

严格模式给Javascript的运行方式带来了许多不同,我将它们分为了两类:明显的(obvious),以及微妙的(subtle)。那些微妙的改变是为了解决微妙的问题,我不打算在这里对其进行赘述。如果你对这些细节感兴趣,请参考DmitrySoshnikov的精彩文章,《ECMA-262-5inDetail.Chapter2.StrictMode》。我对介绍明显的变化更感兴趣:它们是你开始使用严格模式之前所必须了解的,也可能给你带来最多好处。

在开始介绍特殊特性之前,你需要记住,严格模式的目标之一是允许更快地调试错误。帮助开发者调试的最佳途径是当确定的问题发生时抛出相应的错误(throwerrorswhencertainpatternsoccur),而不是悄无声息地失败或者表现出奇怪的行为(这正是如今不在严格模式下的Javascript做的)。严格模式下的代码抛出更多的错误信息,这是好事,因为它能帮助开发者很快注意到一些必须立即解决的问题。

去除with语句(Eliminateswith)

首先,严格模式去除了with语句。当with语句出现在严格模式中时,它会被认为法的Javascript语句并抛出语法错误。所以,使用严格模式的第一步就是确保你没有在使用with。

防止意外的全局变量(Preventsaccidentalglobals)

第二点是,变量在赋值之前必须声明。在非严格模式下,给一个未声明的变量赋值将自动生成一个该名字的全局变量。这是Javascript中最普遍的错误之一。严格模式中,这样做将抛出一个错误。

取消this值的强制转换(Eliminatesthiscoercion)

另一个重要的变化是,当this值为null或undefined时,不会再将其强制转换为全局对象。也就是说,this保留了它的原始值,淘宝网女装秋装外套也因此可能会导致一些依赖于强制转换的代码发生错误。例如:

在这段代码里,调用Person构造函数时缺少了new关键字,此时this值为undefined。由于你不能给undefined添加属性,这段代码抛出了一个错误。在非严格模式下,this会强制转换为全局对象,因此name属性能够被正确赋值为全局变量。

重复(Noduplicates)

当你做了大量的编码的时候,你很容易在对象中定义了重复的属性或者给函数定义了重复的参数名。严格模式下,这两种情况都会导致错误的发生:

这两者都是语法错误,在代码执行之前将抛出错误。

更安全的eval()(Safereval())

eval()没有被移除,但它在严格模式下发生了一些变化。最大的改变是:在eval()语句中声明的变量以及函数不会在包含域中创建。例如:

不可改变引发的错误(Errorsforimmutables)

怎样启用javascriptECMAScript5同时引入了修改属性特征的能力,例如设置一个属性为只读或者冻结整个对象的结构(freezinganentireobject’sstructure)。在非严格模式下,试图修改一个不可变的属性时将悄无声息地失败。你可能在使用一些原生APIs的时候已经遇到这类问题。严格模式将无论你在何时试图使用一种不被允许的方式修改一个对象或对象的属性时抛出错误。

这个例子中,name属性被设置为只读。在非严格模式下,对name的赋值将悄无声息地失败;而在严格模式下,一个错误将被抛出。

注:如果你在使用ECMAScript属性能力(theECMAScriptattributecapabilities),我强烈推荐你严格模式。如果你在改变对象的可变性(mutabilityofobjects),你将遇到一堆错误,而它们在非严格模式下将被安静地带过。

该如何使用它?

在现代浏览器中很容易启用严格模式,只需添加下面一条语句:

虽然这看起来只是一个没有赋值给变量的字符串,但它确实地了Javascript引擎切换为严格模式(那些不支持严格模式的浏览器只是简单地读取了这个字符串然后继续像平常一样运行)。你可以在全局或函数中使用它。话虽这么说,你永远不应该在全局中使用它。全局地使用这条,意味着同个文件下的所有代码都在严格模式下运行。

这看起来似乎不是个大问题,但在我们这个不同脚本堆积在一起的世界里(ourworldoggressivescriptconcatenation)将导致烦。只要有一份脚本全局地包含这条指令,其它的脚本也将在严格模式下运行(可能引发一些你从没预想到的错误)。

因此,最好只在函数内使用严格模式,例如:

结论

我强烈每一个人都开始使用严格模式。现在已经有足够多的浏览器支持该模式,它将把你从藏身代码的错误中出来。你需要确保你没有全局地包含启用指令,但可以频繁地使用IIFEs给任意多的代码应用严格模式。一开始,你将碰到从没遇过的错误——这是很正常的。切换到严格模式后,你需要做足够多的测试来你已hold住你的代码。一定不能只是将“usestrict”扔进你的代码然后就假设不会有错误发生。至少的至少,你该开始使用这个异常有用的语言特性来写更好的代码了。

原文:

【编辑推荐】

转载于:https://www.cnblogs.com/wangseng/archive/2012/04/27/2474225.html

相关文章:

Linux服务器日志备份到本地

1、确定线上服务器的日志文件名称和路径 2、一台本地服务器能连接公网,创建一个日志账户,设置密码 3、线上服务器要求: a、确定是否已安装sshpass包 [rootiZwz9ghdadtaey1msor7gnZ sh]# rpm -qa|grep sshpass sshpass-1.06-1.el7.x86_64 如不…

学习UI设计能做什么

UI设计这个岗位对于目前的很多企业来说是供不应求的,很多刚培训完UI设计的小伙伴,都不知道该如何定位自己的职能岗,那么学习UI设计能做什么呢?来看看下面小编的详细介绍就知道了。 学习UI设计能做什么? 1、图形设计/界面设计 软件产品的产品…

数据结构与算法:14 Leetcode同步练习(五)

Leetcode同步练习(五) 目录 题目01:用栈实现队列题目02:托普利茨矩阵题目03:罗马数字转整数题目04:最长公共前缀题目05:反转字符串题目06:无重复字符的最长子串题目07:…

Oracle Spatial构建自定义投影坐标系

之前项目换过服务器,移植数据库时候并没有正确完整的移植自定义的投影坐标系,结果就报出莫名其妙的一些错误,比如unable to transform rectangle due to: ORA-13199: SRID does not exist。 因为在移植坐标系的时候仅仅只是将MDSYS.SDO_CRS_C…

php.ini 中开启短标签

控制参数&#xff1a; short_open_tag On如果设置为Off&#xff0c;则不能正常解析类似于这样形式的php文件&#xff1a;<?phpinfo()?>而只能解析<?phpphpinfo()?>这样形式的php文件所以要想php支持短标签&#xff0c;需要我们把short_open_tag 设置为On. 本…

参加UI培训就业多长时间

​ UI设计在近几年的发展前景是非常好的&#xff0c;越来越多的人都想要学习UI设计&#xff0c;目前大家比较想了解的是参加UI培训就业多长时间?来看看下面的详细介绍。 参加UI培训就业多长时间? 如今市面上的UI设计培训机构很多&#xff0c;选择一个口碑好靠谱的培训机构学习…

数据结构与算法:15 树

15 树 知识结构&#xff1a; 1. 树的基本概念与术语 1.1 树的定义 树是N(N≥0)N(N \geq 0)N(N≥0)个结点组成的有穷集合 &#xff0c;该集合具有如下特征&#xff1a; &#xff08;1&#xff09;除N0N0N0的树外&#xff0c;有且仅有一个特定的称为根的结点。 &#xff08;…

【as3】键盘事件

在AS3中&#xff0c;键盘事件是由KeyboardEvent类来处理的&#xff0c;属于flash.events包里面&#xff0c;有两种类型的键盘事件&#xff1a;KeyboardEvent.KEY_DOWN 和 KeyboardEvent.KEY_UP&#xff0c;对于键的代码获得我们通过keyCode这个属性 其实键盘事件使用起来还是相…

在后台代码中引入XAML的方法

本文将介绍三种方法用于在后台代码中动态加载XAML&#xff0c;其中有两种方法是加载已存在的XAML文件&#xff0c;一种方法是将包含XAML代码的字符串转换为WPF的对象。 这些是我在编写RegeX时获得的经验&#xff0c;它们将会给WPF程序带来更多的灵活性。 一、在资源字典中载入项…

JavaScript面向对象怎样删除标签页?

单击小标签右上角的按钮可D头删除标签页。其开发思路是&#xff0c;为“x”元素绑定单击事件&#xff0c;事件触发后&#xff0c;通过父元素1i获取索弓引值&#xff0c;然后用这个索引值将对应的li和section删除&#xff0c;并在删除后更新标签页的选中效电下面我们们就开始进行…

数据结构与算法:16 Leetcode同步练习(六)

Leetcode同步练习&#xff08;六&#xff09; 目录 题目01&#xff1a;相同的树题目02&#xff1a;对称二叉树题目03&#xff1a;二叉树的最大深度题目04&#xff1a; Pow(x, n)题目05&#xff1a;子集题目06&#xff1a;格雷编码题目07&#xff1a;二叉树的最近公共祖先题目…

Apache启动时报Could not reliably determine the server's fully qualified domain name

在系统启动时apache&#xff0c;没有启动起来&#xff0c;查看“事件查看器”发现报一些错误&#xff1a; The Apache service named reported the following error:>>> httpd.exe: Could not reliably determine the servers fully qualified domain name, using 19…

Windows Phone SDK update for Windows Phone 7.8

下载&#xff1a;http://www.microsoft.com/en-us/download/details.aspx?id36474 (在线安装) http://kuai.xunlei.com/d/cHbJCAIX4wBNVgFR5aa (离线下载 全语言 5.5G....) MS博客介绍&#xff1a;http://blogs.windows.com/windows_phone/b/wpdev/archive/2013/01/22/now-a…

作为一名合格的前端开发工程师需要会哪些

作为一名合格的前端开发工程师需要会哪些?web前端要学习的内容有很多&#xff0c;想要成为一名合格的web前端工程师&#xff0c;综合实力是要非常强的&#xff0c;来看看下面的详细介绍吧。 作为一名合格的前端开发工程师需要会哪些?前端开发工程师不仅要掌握基本的前端开发技…

memcached部署

第1章 memcached 1 memcached前言 1.1 memcached诞生的原因 2003年诞生了memcached Web1.0 2005以前 企业提供内容为主。 Web2.02005-2012 企业只提供平台&#xff0c;用户参与上传下载内容。 memcached 内存缓存软件&#xff0c;内存比磁盘快。 传统场景中&#xff0c;多数…

线性代数:第二章 矩阵及其运算

本讲义是自己上课所用幻灯片&#xff0c;里面没有详细的推导过程&#xff08;笔者板书推导&#xff09;只以大纲的方式来展示课上的内容&#xff0c;以方便大家下来复习。 本章主要介绍有关矩阵的知识&#xff0c;主要包括矩阵的基本运算&#xff08;加法、数乘、乘法、乘幂、…

sdut 2401 最大矩形面积

1http://acm.sdut.edu.cn/sdutoj/problem.php?actionshowproblem&problemid2401 /*2 最大矩形面积&#xff0c;把边界点加上3 从左往右 处理一遍&#xff1b;4 再从上往下处理一遍&#xff1b;5 */6 7 #include<stdio.h>8 #define maxn 200009 #include<cmath>…

Python中怎样改变集合之间的关系?

Python中怎样改变集合之间的关系?数学中&#xff0c;两个集合关系的常见操作包括&#xff1a;交集、并集、差集、补集。设A&#xff0c;B是两个集合&#xff0c;集合关系的操作介绍如下&#xff1a; 交集是指属于集合A且属于集合B的元素所组成的集合&#xff0c; 并集是指集合…

数据结构与算法:17 图

17 图 知识结构&#xff1a; 1. 图的基本概念与术语 1.1 图的定义 图由顶点集和边集组成&#xff0c;记为G(V,E)G(V,E)G(V,E)。 顶点集&#xff1a;顶点的有穷非空集合&#xff0c;记为V(G)V(G)V(G)。边集&#xff1a;顶点偶对的有穷集合&#xff0c;记为E(G)E(G)E(G) 。 …

云计算安全:技术与应用

云计算安全&#xff1a;技术与应用中国电信网络安全实验室 编著ISBN 978-7-121-14409-72012年1月出版定价&#xff1a;59.00元16开236页宣传语&#xff1a;全面了解云计算安全风险、安全防护手段的佳作&#xff01;内 容 简 介随着云计算的兴起&#xff0c;安全成为云计算能否顺…

再谈HOST文件

前几天弄了一个关于禁止打开某个网站的文章后&#xff0c;觉得这个HOST文件真的挺有意思的。并且也总是想把自己对它新的理解写下来&#xff08;也许大家都明白了&#xff09;以下是HOST文件的内容&#xff1a;# Copyright (c) 1993-1999 Microsoft Corp.## This is a sample H…

PMP®考试是什么机构

项目管理对于很多职场中的人来说是以后要发展的一个方向&#xff0c;随着各职业内卷也越来越严重&#xff0c;pmp认证引起了大家的关注&#xff0c;有朋友问&#xff1a;PMP考试是什么机构?下面我们给大家介绍一下。 PMP考试是什么机构?PMP考试认证在我国大陆地区需要三方机构…

技术图文:03 结构型设计模式(上)

结构型设计模式&#xff08;上&#xff09; 本教程主要介绍一系列用于如何将现有类或对象组合在一起形成更加强大结构的经验总结。 知识结构&#xff1a; 享元模式 – 实现对象的复用 Sunny 软件公司欲开发一个围棋软件&#xff0c;其界面效果如下图所示&#xff1a; 图2 围…

Linux抓包工具tcpdump详解

原文链接 tcpdump是一个用于截取网络分组&#xff0c;并输出分组内容的工具&#xff0c;简单说就是数据包抓包工具。tcpdump凭借强大的功能和灵活的截取策略&#xff0c;使其成为Linux系统下用于网络分析和问题排查的首选工具。 tcpdump提供了源代码&#xff0c;公开了接口&…

学习笔记TF065:TensorFlowOnSpark

2019独角兽企业重金招聘Python工程师标准>>> Hadoop生态大数据系统分为Yam、 HDFS、MapReduce计算框架。TensorFlow分布式相当于MapReduce计算框架&#xff0c;Kubernetes相当于Yam调度系统。TensorFlowOnSpark&#xff0c;利用远程直接内存访问(Remote Direct Memo…

HTML5培训好不好

HTML5培训好不好?这个问题&#xff0c;要看你选择的培训机构&#xff0c;想要学习HTML5技术&#xff0c;靠谱的培训机构非常重要&#xff0c;下面我们就来看看详细的介绍吧。 HTML5培训好不好?从前端开发的基础出发&#xff0c;学习使用HTML&#xff0c;CSS&#xff0c;JavaS…

技术图文:03 结构型设计模式(下)

结构型设计模式&#xff08;下&#xff09; 本教程主要介绍一系列用于如何将现有类或对象组合在一起形成更加强大结构的经验总结。 知识结构&#xff1a; 组合模式 – 树形结构的处理 Sunny 软件公司欲开发一个杀毒&#xff08;AntiVirus&#xff09;软件&#xff0c;该软件…

程序员必知8大排序3大查找(三)

前两篇 《程序员必知8大排序3大查找&#xff08;一&#xff09;》 《程序员必知8大排序3大查找&#xff08;二&#xff09;》 三种查找算法:顺序查找&#xff0c;二分法查找&#xff08;折半查找&#xff09;&#xff0c;分块查找&#xff0c;散列表&#xff08;以后谈&#xf…

MongoDB给数据库创建用户

转自http://www.imooc.com/article/18439 一.先以非授权的模式启动MongoDB非授权&#xff1a; linux/Mac : mongod -f /mongodb/etc/mongo.confwindows : mongod --config c:\mongodb\etc\mongo.conf 或者 net start mongodb &#xff08;前提是mongo安装到了服务里面&#xff…

如何挑选一家好的软件测试培训机构

随着智能时代的发展&#xff0c;我们的手机APP等各种软件都变得越来越复杂化、规模化&#xff0c;软件测试这一步骤是必不可少的&#xff0c;这也造就了这个行业的兴起&#xff0c;越来越多的人想要学习软件测试技术&#xff0c;想要知道如何挑选一家好的软件测试培训机构?来看…