JS-严格模式、非严格模式
2018年11月14日晚上,我在“深入理解javascript”书上第一次知道“严格模式”“非严格模式”这2个名词;
“严格模式”使用指令:“use strict”;
这个指令我其实有经常看到,在其他人的js文件里。当然我是不知道含义的,且我也没有想过要去询问,写在那就在那吧,又不影响我。
今天做这个笔记的原因在于:既然在我学习中遇到了,那我就仔细的学习一下也还是不错的!!!!
为什么使用严格模式?
1.消除js语法的一些不合理、不严谨之处,减少一些怪异行为;
1).消除代码运行的一下不安全之处,保证代码运行的安全;
2).提高编译器效率,增加运行速度;
3).为未来新版本的js做好铺垫。
2.“严格模式”提现了js更合理、更安全、更严谨的发展方向,包括IE10在内的主流浏览器,都已经支持它,许多大项目已经开始全面拥抱它。
3.另一方面,同样的代码,在“严禁模式”中,可能会有不一样的运行结果;一些在“正常模式”下可以运行的语句,在“严禁模式”下将不能运行。掌握这些内容,有助于更细致深入地理解js,让你成为更好的程序员。
0.严格模式其指令出现的位置:
0-1:直接写在<script></script>中的第一行;(表示该篇js都处于严格模式下)
0-2:写在方法中的第一行;(表示该方法下的代码格式都处于严格模式)
1 2 3 4 5 6 7 8 9 10 11 | <script> "use strict" // 以下的所有代码都处于严格模式 <script> <script> function foo(){ "use strict" //该方法下的代码处于严格模式 } </script> |
1.严格模式下,不能使用未声明的变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <script> "use strict" x=123; //报错( Uncaught ReferenceError: x is not defined) </script> <script> x=123; console.log(x) //输出:123 </script> <script> x=123; console.log(x) //输出:123 foo(); //Uncaught ReferenceError: y is not defined function foo(){ "use strict" y=234; //报错,y未定义 } </script> |
//非严格模式
//严格模式及非严格模式
2.严格模式下,不允许删除 变量或对象 (强调:只有configurable设置为true的对象属性,才能被删除。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <script> "use strict" ; var x = 123; delete x; //Uncaught SyntaxError: Delete of an unqualified identifier in strict mode. </script> <script> "use strict" ; var x; 第一种: delete x; //Uncaught SyntaxError: Delete of an unqualified identifier in strict mode. 第二种: var o = Object.create( null ,{ 'x' :{ value:1234, configurable: true } }); console.log(o.x) //输出:1234 delete o.x; //删除成功 console.log(o.x) //输出:undefined </script> |
3.严格模式下,不允许删除函数
1 2 3 4 5 | <script> "use strict" ; function foo(p1,p2){} delete foo; //Uncaught SyntaxError: Delete of an unqualified identifier in strict mode. </script> |
4.严格模式下,不允许参数名相同
1 2 3 4 5 | <script> "use strict" ; function foo(p1,p1){} delete foo; //Uncaught SyntaxError: Duplicate parameter name not allowed in this context </script> |
5.严格模式下,不允许使用八进制
1 2 3 4 | <script> "use strict" ; var x = 010; //Uncaught SyntaxError: Octal literals are not allowed in strict mode. </script> |
6.严格模式下,不允许使用转义字符
1 2 3 4 | <script> "use strict" ; var x = \010; //Uncaught SyntaxError: Invalid or unexpected token(无效或意外的令牌) </script> |
7.严格模式下,不允许对只读属性赋值
1 2 3 4 5 6 7 8 | <script> "use strict" ; var obj = {}; Object.defineProperty(obj, "x" , { value: 0, writable: false });<br> obj.x = 3.14; //Uncaught TypeError: Cannot assign to read only property 'x' of object '#<Object>' </script> |
8.严格模式下,不允许对一个使用getter方法读取的属性进行赋值
1 2 3 4 5 6 7 8 9 | <script> "use strict" ; var obj = { get x() { return 0 } }; obj.x = 3.14; //Uncaught TypeError: Cannot set property x of #<Object> which has only a getter </script> |
9.严格模式下,不允许删除一个不允许删除的属性
1 2 3 4 | <script> "use strict" ; delete Object.prototype; //Uncaught TypeError: Cannot delete property 'prototype' of function Object() { [native code] }(不能删除函数对象()的属性“原型”{ [本机代码] }) </script> |
10.严格模式下,变量名不能使用 "eval" 字符串
1 2 3 4 5 6 7 8 9 10 11 12 | //严格模式下 <script> "use strict" ; var eval = 3.14; //Uncaught SyntaxError: Unexpected eval or arguments in strict mode(严格模式下的意外EVE或参数) console.log(eval) </script> //非严格模式下 <script> var eval = 3.14; console.log(eval) //3.14 </script> |
11.严格模式下,变量名不能使用 "arguments" 字符串
1 2 3 4 5 6 7 8 9 10 11 12 | //严格模式下 <script> "use strict" ; var arguments = 3.14; //Uncaught SyntaxError: Unexpected eval or arguments in strict mode(严格模式下的意外EVE或参数) console.log(arguments) </script> //非严格模式下 <script> vararguments = 3.14; console.log(arguments) //3.14 </script> |
12.严格模式下,不允许使用以下这种语句
1 2 3 4 5 6 | <script> "use strict" with (Math) { x = cos(2) }; //Uncaught SyntaxError: Strict mode code may not include a with statement </script> |
13.严格模式下,由于一些安全原因,在作用域 eval() 创建的变量不能被调用
1 2 3 4 5 | <script> "use strict" eval ( "var x = 2" ); alert (x); //Uncaught ReferenceError: x is not defined </script> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具