您的位置:首页 > Web前端 > JavaScript

JavaScript严格模式到底是何方神圣

2020-04-06 07:19 1491 查看

本文将介绍JavaScript语言中的严格模式,全文内容包括但不限于ES5严格模式下的介绍、严格模式的开启、ES5在严格模式下的变更。

ES5严格模式的介绍

严格模式(Strict mode)是由ECMA-262规范定义的新兴JavaScript标准,第五版发布于2009年12月。旨在改善错误检查功能并且标识可能不会延续到未来JavaScript版本的脚本。ES5严格模式是限制性更强的JavaScript变体,它与常规JavaScript的语义不同,其分析更为严格。
目前,除了IE6-9,其它浏览器均已支持ES5严格模式。

严格模式的目的

  1. 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
  2. 消除代码运行的一些不安全之处,保证代码运行的安全;
  3. 提高编译器效率,增加运行速度;
  4. 为未来新版本的Javascript做好铺垫。
  5. 宽松模块下的,隐藏的问题,不严谨,发展不长久

严格模式的使用

严格模式的使用其实很简单,只需要在代码的首部加入字符串"use strict",就可以了。有两种不同的应用场景,分别为全局模式和局部模式。

  1. 全局模式
"use strict";

var num = 4232;
console.log(num);

执行后输出4232,与非严格模式没什么太大的区别。

  1. 局部模式
    将"use strict"放到函数里的第一行
function fn(){
"use strict"
var num = 4232;
console.log(num);
}
fn()

执行后输出4232,与非严格模式下也没什么区别。
在项目开发中不推荐使用严格模式下的全局模式,例如公司内,多人开发一个项目,涉及到文件合并,如果你用了严格模式,他没有用,那就会出现很多报错。
如果想在多人项目中使用严格模式或着想自定义一个小模块,一般放在匿名函数中开启,但是所有代码都得在匿名函数中实现。
例如:

;(function (){
"use strict";
console.log("hello");
})()

为了养成良好的习惯,一般,在一个新的外部js文件内,上来先开启匿名函数,然后在匿名函数内,再写代码。

  1. 无效模式
    有下列几种场景下不会触发严格模式,"use strict"位置有很大讲究

1)"use strict"前有代码

var a = 10;
"use strict";
console.log(a);

2))"use strict"前有空语句

;
"use strict";
var a = 10;
console.log(a);

function fn() {
;
'use strict';
var a = 200;
}
fn();

当然,在严格模式前加注释是允许的。

ES5在严格模式下的变更

  1. 声明变量必须要加声明关键字
    我们知道JS是弱类型,宽松的语言。不使用var声明的变量默认转为全局变量。但在严格模式中将不允许,会报语法错误。

全局中

"use strict";
a = 10;

执行,bug如下

又如全局for循环

'use strict';
for (i=0; i<5; i++) {
console.log(i)
}

这种写法在非严格模式中很危险,i 会不小心溢出成为全局变量。但在严格模式中会报错。在局部模式中也类似,在此处不再赘述,读者可以自行测试。因此,在声明变量时记得加一个var。

  1. 不允许形参重复
"use strict";
function fn(a,b,b){
console.log(a);
console.log(b);
console.log(b);
}
fn(1,2,3);

执行如下:

  1. arguments接收的实参,不受形参的改变而影响

非严格模式下:

function func(a) {
arguments[0] = 2
alert(a) // 2
}
func(1)

严格模式下:

'use strict'
function func(a) {
arguments[0] = 2
alert(a) // 1
}
func(1)

非严格模式下形参与argumengts绑定,所最后执行为2,而在严格模式中形参不能被arguments所修改,所以执行仍然为1;

  1. 不允许通过arguments.callee找到函数自身
'use strict'
function fn(n){
console.log(arguments.callee === fn);
if(n == 1){
return 1;
}else{
return n * arguments.callee(n-1);
}
}
var num = fn(5);
console.log(num);

执行如下:

  1. with语句不允许使用
'use strict';
var obj = {
name:"Admin",
age:18
}
obj.name
obj.age
with(obj){
console.log(name);
console.log(age);
}

执行如下:

可见严格模式下代码不能包含with语句。

  1. eval和arguments都不允许作为变量名
'use strict'
var eval = "hello";
console.log(eval);
var arguments = "world";
console.log(arguments);

执行结果:

除了不能作为变量名外,eval是在全局模式下(非函数内)的,如果不加严格模式,能够修改变量,例如:

'use strict'
var a = 10
eval('var a = 20; console.log(a)')
console.log(a)

执行输出20,10,如果不添加严格模式,修改的就是全局的a,输出就会变为20,20.

  1. 不允许使用八进制
'use strict'
var a = 0100;
console.log(a);

报错如下:

8.在严格模式下,没有明确隶属对象的函数内部的this为undefined.

'use strict'
function fn(){
console.log(this)
}
fn();

执行结果为undefined.

  • 点赞
  • 收藏
  • 分享
  • 文章举报
lb_nizhanban 发布了3 篇原创文章 · 获赞 0 · 访问量 53 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: