详解 JavaScript 中的严格模式

本文介绍了JavaScript严格模式,它是ES5引入的对sloppy模式的限制性使用,使用时在头部加“use strict;”。阐述了其特点,如各浏览器处理不同、合并代码可能冲突等。列举了应用场景,如禁止使用未申明变量等。还说明了其意义,包括处理遗留问题、修复优化问题等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概念

JavaScript 的严格模式是 ES5 引入的(ES6 默认使用严格模式),使用方法很简单,只需要在头部加上"use strict"; 即可,严格模式是对 sloppy 模式(懒散模式)的一种限制性使用。

二、特点

  • 各浏览器对严格模式的处理不同,使用严格模式得到的结果可能也不尽相同;
  • 代码合并时,严格模式与非严格模式合并后可能引发冲突;
  • 严格模式和非严格模式可以共存,所以项目中可以渐进式的采用严格模式。

三、应用

1. 禁止使用未申明的变量

"use strict";
console.log(a);//引用错误(ReferenceError)
a = 1;

2. 禁止使用 with 函数
with 函数的作用是直接使用对象的属性或方法而不用复写对象。

"use strict";
var obj = {id:10};
var id = 12;
with(obj){//报错
    console.log(id)// 如果没有开启严格模式,with 中的这个 id 会指向 with 上面的那个 id,还是obj.id?
    // 如果不运行代码,无法知道,因此,这种代码让引擎无法进行优化,速度也就会变慢。
}

3. 禁止使用 arguments.callee

"use strict";
function person(){
console.log(arguments.callee)//报错
};
person(1)//arguments.callee 非严格模式下指向正在指向的函数

4. 禁止使用同名的参数

"use strict";
function person(a,a,b){//报错
  console.log(a+a+b);
}person(1,2,3)//非严格模式下后面的参数覆盖前面的,即2+2+3=7;

5. 禁止给原始值添加属性

"use strict";
false.a = 1;//类型错误(TypeError)

6. 禁止删除不可删除的属性

"use strict";
delete Object.prototype;//类型错误(TypeError)

7. 禁止删除申明变量

"use strict";
var x;
delete x;;//语法错误(SyntaxError)

8. 禁止自动创建全局变量

"use strict";
x = 20;
console.log(x);//引用错误(ReferenceError)
//非严格模式下会自动创建一个全局变量,即结果为 20;

9. 禁止使用保留关键字作为变量名或形参名

"use strict";
var public;//语法错误(SyntaxError)
function person(public){
//语法错误(SyntaxError)
}

10. 禁止以0开头来表示八进制,可以以"0o"开头

"use strict";
var x = 010;//语法错误(SyntaxError)
//非严格模式下可以以0开头;

11. 禁止了不在脚本或者函数层面上的函数申明

"use strict";
if(true){
function person(){}
}//报错
function person(){
function animal(){}
}//不报错

12. 在函数作用域内给参数重新赋值不会应用到 arguments[i] 上

"use strict";
function person(a,b){
   a = 3;
   b = 4;
console.log(arguments[0]);//1; 
console.log(arguments[1]);//2; 
};
person(1,2);
//给严格模式下以上输出值是3和4。

13. evel 函数内申明的变量不会影响到全局作用域

"use strict";
var x = 10;
evel("var x = 12");
console.log(x);//10

14. 任何在非严格模式下的静默失败(给不可写属性赋值, 给只读属性(getter-only)赋值, 给不可扩展对象(non-extensible object)的新属性赋值)都会抛出异常

"use strict";
// 给不可写属性赋值
var obj1 = {};
Object.defineProperty(obj1, "x", { value: 42, writable: false });
obj1.x = 9; // 类型错误(TypeError)

// 给只读属性赋值
var obj2 = { get x() { return 17; } };
obj2.x = 5; // 类型错误(TypeError)

// 给不可扩展对象的新属性赋值
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = "ohai"; // 类型错误(TypeError)

15. this 不再转换为包装对象,所传即所得

"use strict";
function person(){
return this;
};
console.log(person());//undefined
console.log(person.call(1));//1
console.log(person.apply('1'));//'1'
console.log(person.bind(null)());//null
//非严格模式下,都会转换为包装类对象。

16. 顶层 this 指向 windows

"use strict";
function person(){
console.log(this);//undefined
};
person();
//严格模式下顶层 this 指向 windows;

四、意义

  • 将 JavaScript 遗留的静默失败问题当成错误处理;
  • 修复浏览器引擎无法优化的问题;
  • 保留未来 JavaScript 版本可能使用的关键字(implements, interface, let, package, private, protected, public, static,yield)。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值