Javascript 严格模式

177 阅读2分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战

什么是严格模式

严格模式是一个使用更严格的条件去检查你的JS代码,使你一些不规范的代码报出错误。它可以使你的代码更加高性能,以及避免一些安全漏洞。
开启严格模式只需要在你的整个 script之前或者 function 函数的第一句加上 'use strict;'

function example() {
    "use strict"
    return "this is an example function"
}

创建变量

在非严格模式下,创建变量时,你可以不用在变量前写const letvar 关键字,它会在全局作用域内创建一个变量,并且正常执行。

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