浅谈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 这样的. 可能有人说这是 ...
随机推荐
- cocos2d-x游戏引擎核心之六——绘图原理和绘图技巧
一.OpenGL基础 游戏引擎是对底层绘图接口的包装,Cocos2d-x 也一样,它是对不同平台下 OpenGL 的包装.OpenGL 全称为 Open Graphics Library,是一个开放的 ...
- solr删除数据的4种方便快捷的方式
1.在solr客户端,访问你的索引库(我认为最方便的方法) 1)documents type 选择 XML 2)documents 输入下面语句 <delete><query> ...
- poj_2396 有上下界的网络流
题目大意 一个mxn的矩阵,给出矩阵中每一行的和sh[1,2...m]以及每一列的数字的和目sv[1,2...n],以及矩阵中的一些元素的范围限制,比如a[1][2] > 1, a[2][3] ...
- JZOJ.5329【NOIP2017模拟8.22】时间机器
Description
- hdu5305 Friends[状压dp]
Friends Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Su ...
- c# Winform间的页面传值
Form2 public partial class Form2 : Form { public string str; public Form2() { InitializeComponent(); ...
- 日志记录---log4j详解
Apache官方项目地址 通常的日志记录的缺点是会减慢程序的运行速度,如果用普通的System.out的话影响视觉效果,另外解耦度也不好,而log4j的设计则使得日志记录变得可靠快速和可拓展性好. l ...
- 树链剖分+线段树+离线(广州网选赛第八题hdu5029)
http://acm.hdu.edu.cn/showproblem.php?pid=5029 Relief grain Time Limit: 10000/5000 MS (Java/Others) ...
- 【php】---mysql---基本操作及使用---【巷子】
1.数据库简介 (1).什么是数据库? 一个文件 一个文件夹 一个u盘 一个硬盘......都叫做数据库 存放数据的仓库 (2).常见的数据库? mySql sql ...
- 使用异步消息处理更新UI线程
1. Android的UI时线程不安全的,如果在子线程中更新UI会出现异常,导致程序崩溃. 为了解决如上这些问题,我们常用的做法就是使用Android的异步消息机制实现即可(创建一个Message对象 ...