在 JavaScript 中定义 use strict 严格模式有什么用?
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论