Javascript专题(一)严格模式
2024-10-20 12:16:56
严格模式是干什么的?它从哪里来?
ECMAScript5中引入了严格模式。它为JS定义了一种不同的解析和执行模型。
摘自阮一峰博客:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html
- 消除JS语法的不合理之处,减少一些怪异行为
- 消除代码运行的一些不安全支出,保证代码安全
- 提高编译器效率,增加运行速度
- 为未来新版本的JS做好铺垫。
正所谓未雨绸缪,JS如今的发展确实是有根源的。从这里做好铺垫我们可以看到JS的野心。
如何开启严格模式?
- 全局开启:"use strict";//可在开头加入,则在整个脚本(从某个
script
标签开始到其闭合,下一个script还是正常模式)开启严格模式
必须在开头加,在其他地方加无效。
(严格地说,只要前面不是产生实际运行结果的语句,"use strict"可以不在第一行,比如直接跟在一个空的分号后面。)
- 局部开启:function doSomething(){"use strict";}
可在函数体内部的头部加入,局部开启严格模式
更严谨的代码,严格模式实例?
以下代码跑在 Node 6.10.0下。
1.在严格模式下,初始化未经声明的变量会导致错误。
haha = 8; // 没有报错
"use strict";
haha = 8; // 报错,直接不让往下运行了。
"use strict";
for (i = 0; i < 8; i++) {
console.log(i);
} // 报错
2.在严格模式下,不能定义名为eval或者arguments的变量,否则会导致语法错误。
按照规则,关键字作为语言保留,不能作标识符,严格模式下的保留字也有所不同。"use strict";
const eval = 8; // 报错。
3.静态绑定。JS的一个语言特点,就是允许"动态绑定".某些属性和方法到底属于哪一个对象,不是在编译的时候确定的,而是在运行的时候确定的。严格模式下,只允许静态绑定。
- 禁止使用
with
- with无法在编译时确定属性归属于哪个对象。
const o = {
name: 'haha',
age: 4
}
const nowName = o.name; // haha
const nowAge = o.age; // 4
// 上面这个的简写其实就是 with 的效果 - 实现对象的引用从而简化代码
// ES3之后已经不需要它了,在它里面是不能用 const 的。。。忽略它吧它吧它吧
with(o) {
var myName = name; // haha
var myAge = age; // 4
}
console.log(nowName, myName, nowAge, myAge);
- 创设 eval 作用域
正常模式下,JS有两种作用域,全局作用域和函数作用域。严格模式创设了第三种。
想一想,这样的话是不是更安全了呢?防止全局字符串被解析为JS,防止注入.eval("var x = 3");
console.log(x); // 3
"use strict";
eval("var x = 3");
console.log(x); // 报错:x is not defined
- 禁止使用
4.禁止this关键字指向全局对象
function test () {
return !!this;
}
console.log(test()); // true - 此时 this 指向全局 !!this 为 true
"use strict";
function test () {
return !!this;
}
console.log(test()); // false - 此时 this 为 undefined,因为严格模式下不允许其指向全局
5.八进制字面量在严格模式下是没有用的,报错(大多数,99%的博客都说没法用八进制,其实可以用
0o12
表示八进制,不能用的是012
不能用罢了)0oxx
表示法可用,直接用0xx
无法用const a = 012;
console.log(a); // 10
"use strict";
const a = 012;
console.log(a); // 报错
6.禁止删除变量
只有
configurable
设置为true的对象属性才能被删除。"use strict";
const x = 3;
delete x; // 报错
"use strict";
const o =Object.create(null, {
'x': {
value: 1,
configurable: true
}
});
delete o.x; // configurable 为 true,可删除
complete
最新文章
- JavaWEB 通过Listener理解域对象生命周期
- livezilla账号或密码修改方法
- leetcode 111
- [QTP/UFT12]无限延长试用期的方法
- Linux Path文件夹内容
- JS数组(Array)处理函数总结
- 阿里云ubuntu搭建SVN服务器
- 正则Match
- NopCommerce架构分析之五------Model绑定Action参数
- poj2909 || poj2262
- BZOJ3231(矩阵连乘,稍有点复杂)
- Extjs 4.2 右键菜单树节点(,选择逆,废除)
- hdu2546 01背包 重学背包
- Python内置函数(24)——set
- Verilog语言实现并行(循环冗余码)CRC校验
- C++11 override 和 final 关键字
- 集腋成裘-01-html -html基础
- SharePoint 2013 APP 开发示例 (四)JQuery访问REST
- GitHub下载安装以及开源项目
- Java 8- Java 分支结构 - if…else/switch