在 JavaScript 中定义 use strict 严格模式有什么用?

发布于 2022-08-08 12:54:35 字数 3683 浏览 129 评论 0

JavaScript 中的严格模式  使 JavaScript 在处理常见错误方面更加严格。 除非您有充分的理由不启用,否则您应该启用严格模式。

要启用严格模式,请将字符串 'use strict' 作为文件或函数中的第一条语句。

// If this is a .js file, you can enable strict mode by putting
// 'use strict' as the first statement in the file. You can put
// comments before 'use strict'
'use strict';
function foo() {
  'use strict';
  // Even if the code outside of 'foo' isn't using strict mode, the code
  // inside `foo()`'s function body will use strict mode
}
var x = 1;
// Does **not** enable strict mode, because the assignment above is the
// first statement in the file.
'use strict';

以下是使用严格模式的一些主要好处:

未声明变量的 ReferenceError

在严格模式之外,下面的代码隐式地创建了一个全局变量 x

function foo() {
  x = 42;
}

foo();
x; // 42, `x` is now a global variable!

使用严格模式,设置 x = 42 没有先声明 x 使用 let 或者 const,var 会抛出错误:

'use strict';

function foo() {
  x = 42; // ReferenceError: x is not defined
}

foo();

this 默认为 undefined

当您调用未绑定到严格模式之外的任何对象的函数时, this 将是全局对象。 很反直觉,对吧?

const foo = function() {
  console.log(this); // Object [global] { ... }
};

foo();

使用严格模式, this 将会 undefined

'use strict';

const foo = function() {
  console.log(this); // undefined
};

foo();

强制只读属性

Object.freeze()函数 使 JavaScript 对象不可变。 您无法在冻结对象上添加或删除属性,或修改现有属性。

很遗憾, Object.freeze() 有一个很大的问题:它 在尝试修改对象的代码处于严格模式时才有效。在严格模式之外,如果您尝试修改冻结的对象,JavaScript 运行时会 放手

const frozen = function() {
  'use strict';
  return Object.freeze({ answer: 42 });
};

const unstrict = function() {
  const obj = frozen();
  // This function is not in strict mode, so you can modify frozen objects
  obj.answer = 43;
  console.log(obj.answer);
};

const strict = function() {
  'use strict';
  const obj = frozen();
  // TypeError: Cannot assign to read only property 'answer' of object '#<Object>'
  obj.answer = 43;
};

unstrict();
strict();

没有在基元上设置属性

在严格模式之外,在数字上设置属性会静默失败。

let answer = 42;

// Fails silently outside of strict mode
answer.prop = 'test';

// undefined
console.log(answer.prop);

在严格模式下,对数字设置属性会引发 TypeError

'use strict';

let answer = 42;

// TypeError: Cannot create property 'prop' on number '42'
answer.prop = 'test';

防止删除 prototype

在严格模式之外,删除不可删除的属性会以静默方式失败:

// Outside of strict mode, this fails silently
delete Object.prototype;

const obj = { answer: 42 };
console.log(obj.constructor.prototype); // {}

在严格模式下,删除 prototype 抛出一个 TypeError

'use strict';

// TypeError: Cannot delete property 'prototype' of function Object() { [native code] }
delete Object.prototype;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

¢好甜

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

yili302

文章 0 评论 0

晚霞

文章 0 评论 0

LLFFCC

文章 0 评论 0

陌路黄昏

文章 0 评论 0

xiaohuihui

文章 0 评论 0

你与昨日

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文