浅谈JS严格模式
浅谈JS严格模式
简介
何为严格模式?严格模式(strict mode)即在严格的条件下运行,在严格模式下,很多正常情况下不会报错的问题语句,将会报错并阻止运行。
但是,严格模式可以显著提高代码的健壮性,比如JS经常被人诟病的隐式创建全局变量,在严格模式下就会阻止运行。
总的来说,引入严格模式虽然会导致一些代码不可运行,但是,严格模式使得一些JS广受诟病的问题无法运行,从长期角度上看,绝对是利大于弊。
用法
进入严格模式的方法很简单,只需要在在需要进入严格模式的作用域开头输入"user strict"
即可,值得一提的是,在无法执行严格模式的旧版浏览器中(IE10之前),该条指令会自动被忽略。
例1:
"user strict";
x = 1; // Uncaught ReferenceError: x is not defined
如例1所示,在全局作用域的开头定义了严格模式,并隐式定义了全局变量x
,x = 1
这条语句在严格模式下,抛出了异常,提示没有显式创建变量a
。
例2:
"use strict";
fn();
function fn () {
x = 1; // Uncaught ReferenceError: x is not defined
}
在例2中,由于严格模式定义在全局作用域中,而fn
作用域被全局作用域所包含,所以fn
作用域中同样执行了严格模式。
注:也可以通过执行上下文栈来解释。
例3:
x = 1;
fn();
function fn () {
"use strict"
y = 2; // Uncaught ReferenceError: y is not defined
}
在例3中,由于严格模式只定义在fn
函数的局部作用域中,在全局作用域中不起作用,所以全局作用域中,隐式定义全局变量x
没有抛出异常,而在局部作用域中,隐式定义全局变量y
抛出异常。
规则
1.严格模式下无法隐式创建全局变量
2.严格模式会使引起静默失败(silently fail,注:不报错也没有任何效果)的赋值操做抛出异常
"use strict";
// 给不可写属性赋值
var obj1 = {};
Object.defineProperty(obj1, "x", { value: 42, writable: false });
obj1.x = 9; // 抛出TypeError错误
// 给只读属性赋值
var obj2 = { get x() { return 17; } };
obj2.x = 5; // 抛出TypeError错误
// 给不可扩展对象的新属性赋值
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = "ohai"; // 抛出TypeError错误
3.在严格模式下,试图删除不可删除的属性时,会抛出异常(之前这种操作不会产生任何效果)
"use strict";
delete Object.prototype; // 抛出TypeError错误
4.在严格模式下,不允许重名属性
"use strict";
var o = { p: 1, p: 2 }; // 语法错误
5.严格模式要求函数参数名唯一
function sum(a, a, c){ // 语法错误
"use strict";
return a + a + c; // 代码运行到这里会出错
}
6.禁止八进制数字语法
"use strict";
var sum = 015 + // 语法错误
197 +
142;
7.禁止设置原始类型(primitive)值的属性
(function() {
"use strict";
false.true = ""; //TypeError
(14).sailing = "home"; //TypeError
"with".you = "far away"; //TypeError
})();
8.禁用with
9.严格模式下,eval()
创建变量不能被调用
"use strict";
eval ("var x = 2");
alert (x); // Uncaught ReferenceError: x is not defined
10.严格模式禁止删除声明变量
"use strict";
var x;
delete x; // 语法错误
eval("var y; delete y;"); // 语法错误
11.不能使用eval
和 arguments
字符串
"use strict";
var arguments = 1; // Uncaught SyntaxError: Unexpected eval or arguments in strict mode
var eval = 2; // Uncaught SyntaxError: Unexpected eval or arguments in strict mode
12.严格模式下,函数的 arguments 对象会保存函数被调用时的原始参数。arguments[i] 的值不会随与之相应的参数的值的改变而变化,同名参数的值也不会随与之相应的 arguments[i] 的值的改变而变化。
13.不再支持arguments.callee
"use strict";
var f = function() { return arguments.callee; };
f(); // TypeError
14.保留部分关键字,这些字符包括implements
, interface
, let
, package
, private
, protected
, public
, static
和yield
。在严格模式下,你不能再用这些名字作为变量名或形参名。
15.禁止this
指向全局对象,当this
指向全局对象时,自动转为undefined
总结
随着JS的飞速发展,出现了一大堆可以代替严格模式的工具,比如eslint
等,但是,当你想要提升原生JS代码的健壮性和可读性,回避JS一些被人诟病的语法,严格模式是你不二的选择。
浅谈JS严格模式的更多相关文章
- 浅谈 js 字符串 search 方法
原文:浅谈 js 字符串 search 方法 这是一个很久以前的事情了,好像是安心兄弟在学习js的时候做的练习.具体记不清了,今天就来简单分析下 search 究竟是什么用的. 从字面意思理解,一个是 ...
- 浅谈JS面向对象
浅谈JS面向对象 一 .什么是面向过程 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了.注重代码的过程部分. 二.什么是面向对象 最先出现在管理学 ...
- 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂
浅谈JS中的!=.== .!==.===的用法和区别 var num = 1; var str = '1'; var test = 1; test == num //tr ...
- 浅谈JS之AJAX
0x00:什么是Ajax? Ajax是Asynchronous Javascript And Xml 的缩写(异步javascript及xml),Ajax是使用javascript在浏览器后台操作HT ...
- 浅谈JS中的闭包
浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...
- 浅谈 js 正则字面量 与 new RegExp 执行效率
原文:浅谈 js 正则字面量 与 new RegExp 执行效率 前几天谈了正则匹配 js 字符串的问题:<js 正则学习小记之匹配字符串> 和 <js 正则学习小记之匹配字符串优化 ...
- 浅谈 js 字符串之神奇的转义
原文:浅谈 js 字符串之神奇的转义 字符串在js里是非常常用的,但是你真的了解它么?翻阅<MDN String>就可以了解它的常见用法了,开门见山的就让你了解了字符串是怎么回事. 'st ...
- 浅谈 js 正则之 test 方法
原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. var re = /\d/; console. ...
- 浅谈 js 数字格式类型
原文:浅谈 js 数字格式类型 很多人也许只知道 ,123.456,0xff 之类的数字格式.其实 js 格式还有很多数字格式类型,比如 1., .1 这样的,也有 .1e2 这样的. 可能有人说这是 ...
随机推荐
- 关于ArrayList和List的区别
ArrayList可以存放不同类型的数据,第一个可以是int,第二个可以是double等等 而List存放的是单一的数据类型的数据用法如下: List<GameObject> xx = n ...
- android 仿QQ手机版
千人2群开启,欢迎大家围观打酱油,群号145667827 您当前位置 : JavaApk-安卓应用游戏源码服务专家 » QQ » Android项目源码界面超级华丽的仿QQ最新版本 Andro ...
- C语言100个经典的算法之兔子总数计算内含printf的用法
语言的学习基础,100个经典的算法 C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的算法 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一 ...
- 64位ubuntu下用code::blocks IDE配置opengl开发环境
http://jingyan.baidu.com/article/c74d60007d104f0f6b595d6d.html 样例程序: #include <GL/glut.h> #inc ...
- Maven 环境变量设置
下载Maven 官方下载地址:http://maven.apache.org/download.html 选择你所希望下载的版本,并保存到常用安装目录.这里以Maven 3.2.2 (Binary z ...
- js+jquery
改变元素的不透明度 <!DOCTYPE html> <html> <head> <script> function ChangeOpacity(x) { ...
- Linux应急响应思路详谈
一.主机篇: 1.自动化初筛,建议使用RootkitHunter (1)安装 $sudo wget https://jaist.dl.sourceforge.net/project/rkhunter/ ...
- 【黑金ZYNQ7000系列原创视频教程】04.熟悉ZYNQ内部中断——内部定时器中断实验
黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36638&extra=page%3D1 爱奇艺地址: http: ...
- 项目中启动另外的一个app
NSMutableString *webViewContent = [[NSMutableStringalloc] init]; [webViewContent appendString:@" ...
- 求树的直径和中心(ZOJ3820)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5374 Building Fire Stations Time Limit: 5 ...