js-严格模式
@
1. 什么是严格模式#
JavaScript 除了提供正常模式外,还提供了严格模式(strict mode)。ES5 的严格模式是采用具有限制性 JavaScript变体的一种方式,即在严格的条件下运行 JS 代码。
严格模式在 IE10 以上版本的浏览器中才会被支持,旧版本浏览器中会被忽略。
严格模式对正常的 JavaScript 语义做了一些更改,比如:
-
消除了 Javascript 语法的一些不合理、不严谨之处,减少了一些怪异行为。
-
消除代码运行的一些不安全之处,保证代码运行的安全。
-
提高编译器效率,增加运行速度。
-
禁用了在 ECMAScript 的未来版本中可能会定义的一些语法,为未来新版本的 Javascript 做好铺垫。比如一些保留字如:
class,enum,export, extends, import, super
不能做变量名
2. 开启严格模式#
语法格式:'use strict';
或者"use strict";
严格模式可以应用到整个脚本或个别函数中。因此在使用时,我们可以将严格模式分为为脚本开启严格模式和为函数开启严格模式两种情况。
-
情况一 :为脚本开启严格模式
<script> //在所有语句之前放一个特定语句“use strict”;( 或‘use strict’;) 。 "use strict"; //当前script标签开启了严格模式 </script>
- 有的 script 脚本是严格模式,有的 script 脚本是正常模式,这样不利于文件合并,所以可以将整个脚本文件放在一个立即执行的匿名函数之中。这样独立创建一个作用域而不影响其他script 脚本文件。
<script> (function (){ //在当前的这个自调用函数中有开启严格模式,当前函数之外还是普通模式 "use strict"; var num = 10; function fn() {} })(); //函数范围外不是严格模式 </script>
-
情况二: 为函数开启严格模式
-
要给某个函数开启严格模式,需要把“use strict”; (或 'use strict'; ) 声明放在函数体所有语句之前。
function fn(){ //当前fn函数开启了严格模式 "use strict"; return "123"; } //函数外的代码依旧若没有声明严格模式,依旧执行旧的模式
-
-
注意:老版本浏览器(IE10之前),并不能解析
user strict;
语句,它会把它看做一行普通字符串忽略,代码并不会开启严格模式。
3.严格模式中的变化#
严格模式对 Javascript 的语法和行为,都做了一些改变,如下:
-
在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,变量都必须先用var 命令声明,然后再使用。
'use strict'; num = 10 console.log(num)//报错:Uncaught ReferenceError: num is not defined
-
严禁删除已经声明变量。 例如,
delete x;
语法是错误的'use strict'; var num2 = 1; delete num2;//报错:Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
-
严格模式下 this 指向问题
-
严格模式下全局作用域中函数中的 this 是 undefined
'use strict'; function fn() { console.log(this); //undefined } fn();
-
严格模式下,如果 构造函数不加new调用, this 指向的是undefined 如果给他赋值则 会报错
'use strict'; function Star() { this.sex = '男'; } // Star();报错:Uncaught TypeError: Cannot set property 'sex' of undefined;但在普通模式下不会报错,this会指向window var ldh = new Star();//new 实例化的构造函数中this指向创建的对象实例。 console.log(ldh.sex);
-
定时器的回调函数中this还是指向window
'use strict'; setTimeout(function() { console.log(this); //window }, 2000);
-
事件监听器、对象的方法还是指向调用者
-
-
函数变化
-
函数不能有重名的参数
-
函数必须声明在顶层,新版本的 JavaScript 会引入“块级作用域”( ES6 中已引入)。为了与新版本接轨,不允许在非函数的代码块内声明函数。
function fn(a, a) {//报错:Uncaught SyntaxError: Duplicate parameter name not allowed in this context console.log(a + a); }; fn(1, 2);
-
作者:Hong•Guo
出处:https://www.cnblogs.com/ghnb1/p/15848446.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix