JavaScript语法支持严格模式:”use strict”
如果给JavaScript代码标志为“严格模式”,则其中运行的所有代码都必然是严格模式下的。 其一:如果在语法检测时发现语法问题,则整个代码块失效,并导致一个语法异常。 其二:如果在运行期出现了违反严格模式的代码,则抛出执行异常。
注:经过测试IE6,7,8,9均不支持严格模式。
JavaScript代码“严格模式”使用方法: 严格模式需要使用字符串序列:
"use strict"
在如下位置加入可以开启相应代码块中的严格模式: 1.必须在全局代码的开始处加入。 2.在eval代码开始处加入。 3.在函数声明代码开始处加入。 4.在new Function()所传入的body参数块开始加入。
例1:
var num =012;alert(num);
在非严格模式下,可以使用0(零)开头前缀声明8进制。显示10。
但是在严格模式下,会产生错误。
"use strict";
var num =012;
alert(num);
测试结果: IE6,7,8,9均显示10。 FF报错:octal literals and octal escape sequences are deprecated Chrome报错:Uncaught SyntaxError: Octal literals are not allowed in strict mode. Opera报错:Syntax error at line 3 while loading: Invalid character var num = 012;
如果使用严格模式,除了0(零)开头前缀8进制以外还有: 1.在代码中不能使用一些扩展的保留字: implements,interface,let,package,private,public,static,yield 2.with语句也不能使用。 3.不能声明或重写eval和arguments两个标识符。 4.不能用delete 删除显式声明的标识符,名称或具名函数。
来源:http://qianduan-notes.diandian.com/post/2012-06-02/40027620460
新规范中的一个有趣部分是严格模式的引入。严格模式是一种许可式(opt-in)机制,允许开发人员使用 JavaScript 语言的一个有限但更整洁的子集。根据 Doug Crockford 的精神,严格模式旨在修复或限制该语言的一些劣迹斑斑的 “坏部分”。
严格模式可以在脚本或函数级别实现。这很不错,因为它允许模块和库作者选择编写严格代码,而不会影响环境的其余部分。有一点需要牢记:由于性能因素连接严格和非严格脚本可能会导致意想不到的结果。
要在脚本级别激活严格模式,可以在文件中所有其他语句之前包含语句 use strict
。清单 1 展示了一个示例。
"use strict"; var myNamespace = { myMethod : function(){ //strict code } } |
在函数级别激活严格模式的方法类似:在函数主体中的其他任何语句之前包含语句 use strict
,如清单 2 所示。
function getStrict(){ "use strict"; //strict code } |
有一点很有趣,应引起注意:用于激活严格模式的语法只是一个字符串表达式语句,这意味着,现在在您的代码中包含该语句本身并不会带来什么坏处。理解它的浏览器会打开该子集。不理解它的浏览器将会将其视为一个表达式语句,忽略它,然后继续处理下一行代码。当然,如果只有少数几个浏览器支持严格模式,激活严格模式可能会导致其他问题,但 Use Strict 指令本身不是其中之一。
下面几个小节简单展示严格模式在您的代码上的效果。尽管这不是对严格模式的每个方面的全面检查,但这些示例展示了这个新模式的主要特征。理解严格模式的最好方法是在一个支持严格模式的浏览器中试用这些示例。
如果足够大胆,您可以将这条指令放到您的一个现有脚本的顶端,看看会导致多少错误(或者没有错误,如果您已经小心翼翼地避免了这些陷阱的话)。
严格模式中我特别喜欢的一个部分,看起来就像代码审查中的一些挑剔部分。严格模式将标准脚本中通常会忽略或静默失败的几种常见负面编码模式转变为实际错误。最常见的一种模式是向一个没有使用 var
语句声明的未声明变量分配一个值,意外创建一个全局变量。在标准代码中,这只是一种不良实践。在严格模式中,将抛出一个引用错误,如清单 3 所示。
function nopullution(){ "use strict"; myAccidentalGlobal = "polluting the global namespace is for losers"; } nopullution(); >>>Error: assignment to undeclared variable myAccidentalGlobal |
在某些情况下,可以通过更改 this
关键字的绑定方式来防止意外全局变量。例如,如果一个构造器函数被直接调用,而不是使用新前缀,this
将被绑定到全局对象。在这种情况下,严格模式将 this
绑定到 undefined
,防止意外破坏全局名称空间。
另外,原来只会静默失败的动作(比如删除一个不可删除的属性或重复参数或属性名称)现在会抛出错误。清单 4 展示了一些示例。
"use strict" delete Array.prototype; >>>Error: property "use strict";Array.prototype is non-configurable and can't be deleted "use strict" var myObj ={ dupe: 1, dupe :2 } >>>Error: property name dupe appears more than once in object literal |
来源:http://www.ibm.com/developerworks/cn/web/wa-ecma262/index.html