Javascript专题(一)严格模式
严格模式是干什么的?它从哪里来?
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()
可在函数体内部的头部加入,局部开启严格模式
更严谨的代码,严格模式实例?
以下代码跑在 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
一遍一遍的咀嚼,总会烂的。