上一节我们学习了JS中的类型转换,本节我们将详细讲解JS中的”严格模式“。那什么是严格模式呢?顾名思义,就是对JS代码进行约束,如果有那些地方非法引用变量或对变量进行非法赋值行为,则直接报错,以此来提高代码的规范性和安全性。

怎么使用”严格模式“?

严格模式可分为两种,要么全局严格,要么局部严格:

全局严格需要在JS代码区域第一行写上'use strict':

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<h1>全局严格</h1>
</body>
<script>
'use strict'//想要实现全局严格,只能写在<script>的下一行,其他地方无效!!!
 
</script>
</html>

局部严格:可以是函数也可以是块级(if语句、for循环等):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<h1>局部严格</h1>
</body>
<script>
function f()
{
  'use strict'//开始函数级严格
}
if(true)
{
  'use strict'//开始块级严格
}
 
</script>
</html>

”严格模式“具体这么约束JS代码?

这里笔者枚举了7个例子来详细说明:

1. 使用未声明变量报错:

<script>
'use strict'
n=1
</script>

2. 使用delete删除变量和函数。(冷知识:delete只能删除对象的属性)

<script>
'use strict'
let s = 'Dotcpp'
function f()
{
}
delete s
delete f
 
</script>

3. 函数参数重名报错:

<script>
'use strict'
function f(s , s)
{
}
 
</script>

4. 普通函数中this在非严格模式下指向window,严格模式下返回undefined。

<script>
'use strict'
function f()
{
 return this;//指向函数调用者,这里指得是浏览器最大的对象window
}
 console.log(f());//严格模式下,返回undefined
 
</script>

5. 严格模式下禁止使用with语句

<script>
'use strict'
// 创建Dotcpp用户
const dotcpp_user = {
 nickName: "dotcpp_user",
 signature:"学习使人进步",
 grade:100,
 degree:'P1',
  greet: function() {
    return `你好,我是${this.nickName}`;//此处this指向调用该方法的对象
  }
};
/*严格模式下直接报错*/
with(dotcpp_user)
{
  console.log(nickName);
  console.log(signature);
  console.log(grade)
  console.log(degree);
}
 
</script>

6. 严格模式下禁止八进制字面量:

<script>
'use strict'
/*禁止八进制字面量*/
// 非严格模式下的问题
var a = 010;     // 开发者以为是 10,实际上是 8
var b = 0010;    // 开发者以为是 10,实际上是 8
</script>

7. 严格模式下分割arguments对象:

非严格模式下双向绑定:

<script>
/* 非严格模式下双向绑定*/
function nonStrictFunc(a, b) {
    console.log("修改前:", a, arguments[0]); // 1, 1
    
    a = 100;                    // 修改参数
    console.log("修改参数后:", a, arguments[0]); // 100, 100 - arguments 也变了!
    
    arguments[0] = 200;         // 修改 arguments
    console.log("修改arguments后:", a, arguments[0]); // 200, 200 - 参数也变了!
}
nonStrictFunc(1, 2);
</script>

严格模式下各自独立:

<script>
// 严格模式下各自独立
'use strict';
function strictFunc(a, b) {
    console.log("修改前:", a, arguments[0]); // 1, 1
    
    a = 100;                    // 修改参数
    console.log("修改参数后:", a, arguments[0]); // 100, 1 - arguments 不变!
    
    arguments[0] = 200;         // 修改 arguments
    console.log("修改arguments后:", a, arguments[0]); // 100, 200 - 参数不变!
}
strictFunc(1, 2);
 
</script>

总结:使用严格模式,可以使得我们的JS代码更加规范。推荐在新项目里使用严格模式,养成编码规范;老项目里考虑到兼容性问题最好别使用严格模式。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)