JavaScript严格模式到底是何方神圣
本文将介绍JavaScript语言中的严格模式,全文内容包括但不限于ES5严格模式下的介绍、严格模式的开启、ES5在严格模式下的变更。
ES5严格模式的介绍
严格模式(Strict mode)是由ECMA-262规范定义的新兴JavaScript标准,第五版发布于2009年12月。旨在改善错误检查功能并且标识可能不会延续到未来JavaScript版本的脚本。ES5严格模式是限制性更强的JavaScript变体,它与常规JavaScript的语义不同,其分析更为严格。
目前,除了IE6-9,其它浏览器均已支持ES5严格模式。
严格模式的目的
- 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
- 消除代码运行的一些不安全之处,保证代码运行的安全;
- 提高编译器效率,增加运行速度;
- 为未来新版本的Javascript做好铺垫。
- 宽松模块下的,隐藏的问题,不严谨,发展不长久
严格模式的使用
严格模式的使用其实很简单,只需要在代码的首部加入字符串"use strict",就可以了。有两种不同的应用场景,分别为全局模式和局部模式。
- 全局模式
"use strict"; var num = 4232; console.log(num);
执行后输出4232,与非严格模式没什么太大的区别。
- 局部模式
将"use strict"放到函数里的第一行
function fn(){ "use strict" var num = 4232; console.log(num); } fn()
执行后输出4232,与非严格模式下也没什么区别。
在项目开发中不推荐使用严格模式下的全局模式,例如公司内,多人开发一个项目,涉及到文件合并,如果你用了严格模式,他没有用,那就会出现很多报错。
如果想在多人项目中使用严格模式或着想自定义一个小模块,一般放在匿名函数中开启,但是所有代码都得在匿名函数中实现。
例如:
;(function (){ "use strict"; console.log("hello"); })()
为了养成良好的习惯,一般,在一个新的外部js文件内,上来先开启匿名函数,然后在匿名函数内,再写代码。
- 无效模式
有下列几种场景下不会触发严格模式,"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在严格模式下的变更
- 声明变量必须要加声明关键字
我们知道JS是弱类型,宽松的语言。不使用var声明的变量默认转为全局变量。但在严格模式中将不允许,会报语法错误。
全局中
"use strict"; a = 10;
执行,bug如下
又如全局for循环
'use strict'; for (i=0; i<5; i++) { console.log(i) }
这种写法在非严格模式中很危险,i 会不小心溢出成为全局变量。但在严格模式中会报错。在局部模式中也类似,在此处不再赘述,读者可以自行测试。因此,在声明变量时记得加一个var。
- 不允许形参重复
"use strict"; function fn(a,b,b){ console.log(a); console.log(b); console.log(b); } fn(1,2,3);
执行如下:
- 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;
- 不允许通过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);
执行如下:
- with语句不允许使用
'use strict'; var obj = { name:"Admin", age:18 } obj.name obj.age with(obj){ console.log(name); console.log(age); }
执行如下:
可见严格模式下代码不能包含with语句。
- 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.
- 不允许使用八进制
'use strict' var a = 0100; console.log(a);
报错如下:
8.在严格模式下,没有明确隶属对象的函数内部的this为undefined.
'use strict' function fn(){ console.log(this) } fn();
执行结果为undefined.
- 点赞
- 收藏
- 分享
- 文章举报
- javascript中的严格模式
- javascript中的严格模式
- javascript严格模式下的8点规则
- javascript中严格模式中的作用域问题
- javascript 语句和严格模式(三)
- 浅谈JavaScript严格模式
- 浅谈JavaScript严格模式
- javascript 语句和严格模式(三)
- 是时候开始使用JavaScript严格模式了
- Javascript之严格模式详解
- javascript中的严格模式
- 理解javascript中的严格模式
- Javascript 严格模式“use strict” 详解
- javascript严格模式
- 是时候使用Javascript严格模式了
- JavaScript面向对象编程,严格过程的标准化编程法,目前为止最面向对象的JS模式(像Java)
- Javascript 严格模式use strict详解
- 跟我学习javascript的严格模式
- javascript的严格模式
- javascript中的严格模式