您现在的位置是:网站首页 > 严格模式文章详情

严格模式

JavaScript的严格模式是一种限制性更强的代码执行环境,它通过抛出更多错误和禁用某些不安全特性来提高代码质量。严格模式可以应用于整个脚本或单个函数,帮助开发者避免常见的陷阱。

严格模式的启用

在脚本或函数开头添加特定指令即可启用严格模式。全局使用时需放在所有其他语句之前:

// 全局严格模式
'use strict';
function doSomething() {
  // 函数代码
}

函数内部使用时:

function strictFunction() {
  'use strict';
  // 函数代码
}

变量声明要求

严格模式要求所有变量必须显式声明:

'use strict';
x = 10; // ReferenceError: x is not defined

正确的做法是:

'use strict';
let x = 10; // 正确

禁止删除不可删除的属性

尝试删除变量、函数或不可配置的属性会抛出错误:

'use strict';
delete Object.prototype; // TypeError
let y = 15;
delete y; // SyntaxError

函数参数限制

严格模式禁止重复的参数名:

'use strict';
function sum(a, a, c) { // SyntaxError
  return a + a + c;
}

this 绑定变化

非严格模式下,全局函数的this指向window,严格模式下为undefined:

'use strict';
function showThis() {
  console.log(this); // undefined
}
showThis();

禁止八进制字面量

严格模式移除了八进制数字表示法:

'use strict';
let octal = 010; // SyntaxError

eval 限制

严格模式为eval创建独立作用域:

'use strict';
eval('var x = 2');
console.log(x); // ReferenceError

只读属性赋值

尝试修改只读属性会抛出错误:

'use strict';
let obj = {};
Object.defineProperty(obj, 'x', { value: 42, writable: false });
obj.x = 9; // TypeError

arguments 对象限制

严格模式下arguments对象与参数解耦:

'use strict';
function fn(a) {
  a = 2;
  return [a, arguments[0]];
}
console.log(fn(1)); // [2, 1]

禁止使用with语句

严格模式禁用with语句:

'use strict';
with (Math) { // SyntaxError
  x = cos(3);
}

新增保留字

严格模式将一些未来可能使用的关键字列为保留字:

'use strict';
let implements = 10; // SyntaxError

更安全的eval和arguments

严格模式限制对eval和arguments的操作:

'use strict';
eval = 17; // SyntaxError
arguments++; // SyntaxError

函数块级声明

ES5严格模式禁止在块中声明函数:

'use strict';
if (true) {
  function f() {} // SyntaxError in ES5 strict
}

显式报错的常见操作

严格模式将静默错误转为显式报错:

'use strict';
NaN = 1; // TypeError
undefined = 5; // TypeError

性能优化优势

严格模式代码通常运行更快,因为:

  1. 变量引用无需查询原型链
  2. 编译器可以更好地优化代码结构
  3. 减少了运行时动态检查

模块和类中的严格模式

ES6模块和类自动启用严格模式:

class StrictClass {
  constructor() {
    x = 1; // ReferenceError
  }
}

迁移到严格模式的注意事项

  1. 逐步迁移,先测试单个文件
  2. 注意第三方库兼容性
  3. 使用try-catch处理可能抛出的错误
  4. 检查所有变量声明

浏览器兼容性处理

可以通过IIFE实现兼容:

(function() {
  'use strict';
  // 严格模式代码
})();

调试技巧

严格模式下的错误信息通常更具体:

  1. 注意错误类型变化
  2. 堆栈跟踪更准确
  3. 使用开发者工具设置断点

常见误区和解决方案

  1. 忘记在文件开头添加'use strict'

    • 解决方案:使用编辑器片段或模板
  2. 合并严格和非严格脚本

    • 解决方案:统一模式或使用IIFE隔离
  3. 依赖非严格特性

    • 解决方案:重写相关代码逻辑

我的名片

网名:~川~

岗位:console.log 调试员

坐标:重庆市-九龙坡区

邮箱:cc@qdcc.cn

沙漏人生

站点信息

  • 建站时间:2013/03/16
  • 本站运行
  • 文章数量
  • 总访问量
微信公众号
每次关注
都是向财富自由迈进的一步