2020-12-02 22:20:54
JavaScript严格模式通过禁止不安全行为和优化代码结构,显著提升了代码安全性,并在特定场景下带来轻微性能优化,是现代开发的推荐实践。具体影响如下:
一、对代码安全性的提升防止意外创建全局变量
非严格模式下,未声明的变量赋值会隐式创建全局变量,易引发命名冲突或数据污染。
严格模式下直接抛出ReferenceError,强制开发者显式声明变量(如let/const),减少低级错误。
禁止this指向全局对象
非严格模式中,函数内未指定this时默认指向window(浏览器)或global(Node.js),可能导致意外修改全局状态。
严格模式下this为undefined,避免误操作全局对象,例如:function foo() { console.log(this); }foo(); // 严格模式输出 undefined,非严格模式输出全局对象
禁用with语句
with会动态改变作用域链,导致代码行为不可预测且难以优化。
严格模式直接禁止with,强制使用显式作用域访问(如对象属性),提升代码可读性和安全性。
限制重复参数名
函数中定义同名参数在严格模式下会抛出SyntaxError,避免参数覆盖导致的逻辑错误。
例如:function bar(a, a) {} // 严格模式报错,非严格模式静默接受
更严格的eval行为
非严格模式下,eval可能将新变量引入外层作用域,产生副作用。
严格模式中eval的变量仅限于当前作用域,减少意外污染。
更高效的变量访问
严格模式禁止with和arguments.callee等模糊作用域的操作,使引擎能更准确地进行变量绑定和优化。
例如,with会迫使引擎动态查找变量,而严格模式下的代码结构更静态,便于优化。
便于静态分析
严格模式下的代码(如显式声明变量、禁止重复参数)结构更清晰,引擎可提前确定变量作用域,减少运行时解析开销。
这有助于提升编译效率,尤其在大型项目中。
减少运行时检查
非严格模式下,某些错误操作(如删除不可配置属性)会静默失败,导致潜在问题隐藏。
严格模式直接抛出错误(如TypeError),避免后续逻辑因数据不一致而崩溃,间接提升执行稳定性。
局部启用
严格模式通过"use strict";指令启用,可作用于整个脚本或单个函数。
例如:"use strict";function test() { /* 严格模式生效 */ }
模块化开发中的推荐实践
现代模块系统(如ES6模块)默认启用严格模式,无需手动添加指令。
团队协作项目中建议统一开启,避免混合模式导致的行为不一致。
老旧代码迁移
部分老代码可能依赖非严格行为(如arguments.callee),迁移时需充分测试验证。
例如,严格模式禁止通过arguments.callee递归调用匿名函数,需改用命名函数表达式。
建议开发者在所有新项目中启用严格模式,并逐步迁移老旧代码,以充分利用其安全性和性能优势。