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

是时候开始使用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

更多相关:

  • 再次重申awk的语法 awk [options] ‘Pattern {Actions}’ file1,file2… awk模式,在之前的文章中简单使用了BEGIN和END。这里的模式,其实我们可以理解成是条件,awk是一行行处理数据的,如果满足某个条件awk就处理某一行数据,如果不满足就不处理,这就可以理解成模式。 意思就...

  • 一. vim的三种模式 在Linux操作系统下,我们一般会使用vim进行文本编辑,它相当于Windows下的记事本,但是它比记事本的功能强大的多。vim一般有三种模式分别是普通模式,编辑模式和命令模式。普通模式和编辑模式可以来回的切换,普通模式可以和命令模式来回的切换,但是编辑模式和命令模式不能来回的切换。 二. vim三种模...

  • 注意事项 1、U盘要是USB3.0的U盘,否则基本会失败 安装到最后的时候报一个 cd/dvd 设备 low speed的故障 2、bios 设置 硬盘模式 选择 AHCImode 模式, 否则刷机不成功 3、 U盘镜像的烧录方式, 实测windows 下的rufus工具有效...

  • linux 设置分辨率 如果你需要在linux上设置显示屏的分辨率,分两种情况:分辨率模式存在与分辨率模式不存在,具体如下。 1,分辨率模式已存在 1)如何查询是否存在: 图形界面:在System Settings/Displays/Resolution栏查看下拉列表。 控制台:在控制台输入命令:xrandr,即会输出当前已存...

  •   Bulk加载模式是Informatica提供的一种高性能数据加载模式,它利用数据库底层机制,依靠调用数据库本身提供的Utility来进行数据的加载  该方式将绕过数据库的log记录,以此提高数据库加载性能,因此Bulk模式不能进行数据的Rollback操作,也不可能使用数据库做Recover操作   因此当使用Bulk加载模式时...

  • 1. Go 的错误机制 Go 语言的错误机制中与其他语言的主要差异如下: 没有异常机制error 类型实现了 error接口type error interface {Error() string } 可以通过errors.New来快速创建错误实例errors.New(" num is not in range[0,100]")...

  • 能够在Linux系统下体验到原生界面的网易云音乐是件不错的事情,但是它总是经常性的出现网络异常,界面无响应的问题 为了听歌的体验,进行深入探究: 首先通过终端启用网易云音乐:sudo netease-cloud-music 会得到网易云音乐运行时的信息,比如一些出错的信息 其实我已经解决了首要的问题(QSslSocket错误),因...

  • 【错误页面处理】 訪问一个错误的控制器 訪问一个错误的方法 有些控制器和方法禁止訪问   以上訪问会提示错误信息 404  403 以上错误信息是不方便给外边用户看到的。 1. 安全隐患 2. 用户体验不好 错误信息在site/error这个地方定义的。   如今我们要自己定义错误页面来显示我们的错误信息 转载于:...

  • 噪声的来源: 1、noise in y 2、noise in x 在有noise的情况下,vc bound还会work么??? 之前,x ~ p(x)  现在 y ~ P( y | x ) 在hoeffding的部分,只要 (x, y) 联合分布满足某个分布, 结果是一致的。   error measure:打分衡量f和g的距离 1、...

  • 在IIS7.5打开网页的时候,提示: HTTP 错误 500.0 - Internal Server Error 调用 LoadLibraryEx 失败,在 ISAPI 筛选器 C:WindowsMicrosoft.NETFrameworkv4.0.30319\aspnet_filter.dll,经过排除发现原来是两个斜杠导...