「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」
什么是严格模式
严格模式是一个使用更严格的条件去检查你的JS代码,使你一些不规范的代码报出错误。它可以使你的代码更加高性能,以及避免一些安全漏洞。
开启严格模式只需要在你的整个 script之前或者 function 函数的第一句加上 'use strict;'
function example() {
"use strict"
return "this is an example function"
}
创建变量
在非严格模式下,创建变量时,你可以不用在变量前写const let 或 var 关键字,它会在全局作用域内创建一个变量,并且正常执行。
number = 10;
console.log(number); // 10
但是,这不是我们想要的行为。因为它可能会让我们产生意外创建新变量的风险。所以在严格模式下,这种行为不被允许,浏览器会抛出 ReferenceError 错误
"use strict"
number = 10; // Uncaught ReferenceError: number is not defined
在非严格模式下使用 delete 删除变量虽然不会生效但是也不会进行报错。
var a = 1;
delete a;
console.log(a) // 1
而在严格模式下会抛出 SyntaxError 错误。
var a = 1;
delete a; // SyntaxError
console.log(a)
原始值上设置属性
在JavaScript上,可以在原始值上设置属性。并且不会报错,比如。 ···js NaN = 10; consoel.log(NaN); // NaN
undefined = 10; console.log(undefined); // undefined
true.string = "hi";
"string".update = 10;
···
上面的这些赋值行为,很明显是错误的,但是在非严格模式下,并不会进行报错。
而在严格的模式会阻止你在原始值上设置属性。
'use strict'
NaN = 10; // TypeError
undefined = 10; // TypeError
true.string = "hi"; // TypeError
"string".update = 10; // TypeError
对只读属性赋值
非严格模式对只读属性赋值不会抛出错误。
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 1;
console.log(obj); // { x: 0 }
而严格模式下修改只读属性会抛出错误
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 1; // TypeError: Cannot assign to read only property 'x' of object
with
with 语句可以扩展一个语句的作用域链。在非严格模式下是允许使用的。
const myObject = {
title: "标题",
author: "小明"
};
with (myObject) {
console.log (`这篇文章的作者是 ${author}`) // 这篇文章的作者是 小明
}
但是并不建议使用with语句,因为它可能是混淆错误和兼容性问题的根源。如果使用的地方较多会对我们造成混淆,导致出现一些意外的错误。所以在严格模式下,禁止使用with语句
'use strict'
const myObject = {
title: "标题",
author: "小明"
};
with (myObject) {
console.log (`这篇文章的作者是 ${author}`) // 这篇文章的作者是 小明
}
// 抛出错误 SyntaxError: Strict mode code may not include a with statement