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 摘译(文章内的代码有些过期 ...
随机推荐
- 如何安装docker-compose
docker-compose还是挺好用的~~~~~ 这里简单介绍下两种安装docker-compose的方式,第一种方式相对简单,但是由于网络问题,常常安装不上,并且经常会断开,第二种方式略微麻烦,但 ...
- Telegraf+InfluxDB+Grafana快速搭建实时监控系统 监控postgresql
Telegraf+InfluxDB+Grafana快速搭建实时监控系统 监控postgresql
- jQuery运行方式818
我们平时打开JQ源码就会看到这么一段代码 (function (window, undefined) { //JQ代码 })(window) 有一点经验的朋友会知道这是js自执行函数 它的好处主要作用 ...
- In R, how to split/subset a data frame by factors in one column?
按照某列的值拆分data.frame My data is like this (for example): ID Rate State 1 24 AL 2 35 MN 3 46 FL 4 34 AL ...
- C艹 指针和const的关系和注意事项(非常有意思)
有两种不同的形式将const关键字指向指针. 第一种:让指针指向一个常量对象 const float g_moon = 1.63; float * pm = &g_moon; // 不允许 n ...
- JBMP学习引导
好文: 偶然机会,认识了工作流系统,并且在www.open-open.com(相当不错的开源项目站点,极力推荐!)上了解了些相当出色的工作流系统,不过呼声最高的应该属JBoss 的JBPM工作流组件了 ...
- 使用Unity中的Box Collider组件完成游戏场景中的碰撞检测功能
一.介绍 目的:通过Unity自带的组件完成游戏场景中的碰撞检测功能. 软件环境:Unity 2017.3.0f3 二.实现过程 1,在面板中点击Add Component按钮 2,添加Box Col ...
- 第三百八十七节,Django+Xadmin打造上线标准的在线教育平台—网站上传资源的配置与显示
第三百八十七节,Django+Xadmin打造上线标准的在线教育平台—网站上传资源的配置与显示 首先了解一下static静态文件与上传资源的区别,static静态文件里面一般防止的我们网站样式的文件, ...
- iPhone开发中,关于视图跳转的总结(转)
iPhone开发中,关于视图跳转的总结 iPhone开发中从一个视图跳到另一个视图有三种方法: 1. self.view addSubView:view .self.window addSubView ...
- [poj 1947] Rebuilding Roads 树形DP
Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10653 Accepted: 4884 Des ...