Strict Mode (JavaScript)
摘要:
ECMAScript5中引入的严格模式,通过让JavaScript运行环境对一些开发过程中最常见和不易发现的错误做出和当前不同的处理,来让开发者拥有一个”更好”的JavaScript语言。但目前为止,所有主流的浏览器都在他们的高版本中支持了严格模式,包括IE10、Firefox4、chrome12、Opera12、Android4和IOS5。
严格模式是一个更好的方法引入检查错误代码。使用严格的模式时,您不能,例如,使用隐式声明变量,给只读属性赋值,或将属性添加到一个不可扩展的对象中。
声明严格模式:
你可以宣布严格模式通过添加“use strict”;在一个文件、一个程序或一个函数的开始。这种声明称为指令序言。严格模式声明的范围取决于它的上下文。如果它是宣布在全局上下文(一个函数的范围之外),程序的所有代码在严格的模式下执行。如果在一个函数内声明它,则函数内所有的代码在严格模式下执行。例如,在下面的示例中所有的代码都是在严格模式下,函数外声明的变量导致语法错误“变量未定义的严格模式”。
"use strict";
function testFunction(){
var testvar = 4;
return testvar;
}
// This causes a syntax error.
testvar = 5;
在接下来的例子中,只有testFunction里面的代码在严格模式下执行。函数外的变量未声明不会导致一个语法错误,但在函数内会导致语法错误。
function testFunction(){
"use strict";
// This causes a syntax error.
testvar = 4;
return testvar;
}
testvar = 5;
注意:
- 如果浏览器不支持严格模式会忽略"use strict"这个字符串。这样就允许跨浏览器的使用严格模式语法,这是为了保证向前兼容,防止有一天某些浏览器仅仅支持严格模式。测试你的浏览器是否支持严格模式
- 当严格模式的方法调用了一个非严格方法时,该非严格方法不会启用严格模式,因为非严格方法被当作参数传递或是通过call和apply调用
- 当严格模式的方法调用了一个非严格方法时,该非严格方法不会启用严格模式,因为非严格方法被当作参数传递或是通过call和apply调用
严格模式的利与弊:
- 优点:
提高编译器效率,增加运行速度
消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为
消除代码运行的一些不安全之处,保证代码运行的安全 - 缺点:
在"严格模式"中,同样的代码可能会有不一样的运行结果
一些在"正常模式"下可以运行的语句,在"严格模式"下将不能运行
严格模式的限制:
下表列出了在严格模式最重要的限制
Language element |
Restriction |
Error |
Example |
Variable |
Using a variable without declaring it. |
SCRIPT5042: Variable undefined in strict mode |
testvar = 4; |
Read-only property |
Writing to a read-only property. |
SCRIPT5045: Assignment to read-only properties is not allowed in strict mode |
var testObj = Object.defineProperties({}, { |
Non-extensible property |
Adding a property to an object whoseextensibleattribute is set to false. |
SCRIPT5046: Cannot create property for a non-extensible object |
var testObj = new Object(); Object.preventExtensions(testObj); testObj.name = "Bob"; |
delete |
Deleting a variable, a function, or an argument. Deleting a property whoseconfigurableattribute is set to false. |
SCRIPT1045: Calling delete on <expression>is not allowed in strict mode |
var testvar = 15;function testFunc() {};delete testvar;delete testFunc; Object.defineProperty(testObj, "testvar", { |
Duplicating a property |
Defining a property more than once in an object literal. |
SCRIPT1046: Multiple definitions of a property not allowed in strict mode |
var testObj = { |
Duplicating a parameter name |
Using a parameter name more than once in a function. |
SCRIPT1038: Duplicate formal parameter names not allowed in strict mode |
function testFunc(param1, param1) { return 1; |
Future reserved keywords |
Using a future reserved keyword as a variable or function name. |
SCRIPT1050: The use of a future reserved word for an identifier is invalid. The identifier name is reserved in strict mode. |
|
Octals |
Assigning an octal value to a numeric literal, or attempting to use an escape on an octal value. |
SCRIPT1039: Octal numeric literals and escape characters not allowed in strict mode |
var testoctal = 010;var testescape = \010; |
this |
The value ofthis is not converted to the global object when it is null orundefined. |
function testFunc() { In non-strict mode, the value of testvar is the global object, but in strict mode the value is undefined. |
|
evalas an identifier |
The string "eval" cannot be used as an identifier (variable or function name, parameter name, and so on). |
var eval = 10; |
|
Function declared inside a statement or a block |
You cannot declare a function inside a statement or a block. |
SCRIPT1047: In strict mode, function declarations cannot be nested inside a statement or block. They may only appear at the top level or directly inside a function body. |
var arr = [1, 2, 3, 4, 5]; |
Variable declared inside an evalfunction |
If a variable is declared inside anevalfunction, it cannot be used outside that function. |
SCRIPT1041: Invalid usage of 'eval' in strict mode |
eval("var testvar = 10"); Indirect evaluation is possible, but you still cannot use a variable declared outside the eval function. var indirectEval = eval; This code causes an error SCRIPT5009: 'testVar' is undefined. |
Argumentsas an identifier |
The string "arguments" cannot be used as an identifier (variable or function name, parameter name, and so on). |
SCRIPT1042: Invalid usage of 'arguments' in strict mode |
var arguments = 10; |
argumentsinside a function |
You cannot change the values of members of the localargumentsobject. |
function testArgs(oneArg) { In non-strict mode, you can change the value of the oneArgparameter by changing the value of arguments[0], so that the value of both oneArg and arguments[0] is 20. In strict mode, changing the value of arguments[0] does not affect the value of oneArg, because the arguments object is merely a local copy. |
|
arguments.callee |
Not allowed. |
function (testInt) { |
|
with |
Not allowed. |
SCRIPT1037: 'with' statements are not allowed in strict mode |
with (Math){ |
Strict Mode (JavaScript)的更多相关文章
- Javascript 严格模式("use strict";)详细解解
1 1 1 Javascript 严格模式("use strict";)详细解解 "use strict";定义JavaScript代码应该在"str ...
- 初始JavaScript
本文是笔者在看廖雪峰老师的JavaScript教程时的总结 一.加载 JavaScript 1.直接在html语句中写入JavaScript语句 2.在html ...
- JavaScript学习基础篇【第1篇】: JavaScript 入门
JavaScript 快速入门 JavaScript代码可以直接嵌在网页的任何地方,不过通常我们都把JavaScript代码放到<head>中,由<script>...< ...
- javascript之标识(zhi)符、关键字与保留字
正确区分标识(zhi)符.关键字与保留字 我发现很多初学者往往弄不清楚这三者的区别,甚至会把标识符的“识(zhi)”读作识(shi),真是愧对小学的语文老师啊!!! 注意:在JavaScript中,所 ...
- 为什么使用"use strict"可以节约你的时间
转: http://ourjs.com/detail/52f572bf4534c0d806000024 "use strict"是JavaScript中一个非常好的特性,而且非常容 ...
- javascript变量 数组 对象
一 变量 1.全局变量和局部变量 在JavaScript中同一个变量可以反复赋值,而且可以是不同类型的变量,但是要注意只能用var声明一次.这种变量类型不固定的语言称为动态语言,与之对应的静态语言,如 ...
- JavaScript 比较操作符,严格比较===
JavaScript 有两种比较方式:严格比较运算符和转换类型比较运算符.对于严格比较运算符(三个 =)来说,为ture的情况是仅当两个操作数拥有相同的类型,而对于被广泛使用的比较运算符(两个 =)来 ...
- JavaScript学习笔记(一)——数据类型和变量
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
- JavaScript Transpilers: 为什么需要用它们?Babel的使用介绍。
英文原文 https://scotch.io/tutorials/javascript-transpilers-what-they-are-why-we-need-them 摘译(文章内的代码有些过期 ...
随机推荐
- 工具软件 PYUV打开raw图片
引自:http://blog.csdn.net/lavenderss/article/details/51495648 [pYUV]如何打开YUV/RGB图片 pYUV工具本身使用起来比较简单,但如果 ...
- filezilla server老提示connect server
地址设置成127.0.0.1即可 端口14147 密码为空(也可能是string未测试) 上次登录的默认路径:C:\Users\admin\AppData\Roaming\FileZilla Serv ...
- .Net程序帮助文档制作
一,准备工作 1,首先介绍一款VS的代码注释插件GhostDoc 你也许认为我们在代码中敲入///就能自动生成xml注释,但这种注释是没有说明文字的.而GhostDoc可以生成一些简单的说明文字,如果 ...
- 手动释放linux内存cache
总有很多朋友对于Linux的内存管理有疑问,之前一篇linux下的内存管理方式似乎也没能清除大家的疑虑.而在新版核心中,似乎对这个问题提供了新的解决方法,特转出来给大家参考一下.最后,还附上我对这方法 ...
- Linux文本编辑器(九)
[教程主题]:Linux文本编辑器 [1]vi vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任 何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令. 由于对U ...
- 即时通信(IM)和实时通信(RTC)的区别
即时通信(IM=nstant messaging)和实时通信(rtc=Real-time communication)都是一套网络通信系统,其本质都是对信息进行转发.其最大的不同点,是对信息传递的时间 ...
- FatJar in 创新实训 自然语言交流系统
Fat Jar Eclipse Plug-In是一个可以将Eclipse JavaProject的所有资源打包进一个可执行jar文件的小工具,可以方便的完成各种打包任务,我们经常会来打jar包,但是e ...
- Windows IOT 开发入门(硬件入门)
接上文,在准备工作完成之后.接下来应该要熟悉硬件和架构了. 以下是一个简易物联网架构设计图 关于微软云这里就不说太多了.有兴趣的朋友可以去这里了解更多https://www.azure.cn/. 在上 ...
- 【转】]监听SMS消息/编程实现短信拦截
当设备接收到一条新的SMS消息时,就会广播一个包含了android.provider.Telephony.SMS_RECEIVED动作的Intent.注意,这个动作是一个字符串值,SDK 1.0不再包 ...
- 【3】JVM-OutOfMemory异常重现
JVM中常见的OOM,那么如何通过自己编写代码产生这些OOM异常呢?通过写代码重现异常,是为了避免在工作中写出有OOM BUG的代码.之前虽然看过相关文章,但是没自己写过这些代码,这次在编写的实际过程 ...