前端JavaScript '严格模式' 的最全总结

在阅读jQuery源码的时候,发现jQuery用到的是’use strict’严格模式。因此就去查阅了一些资料来补充自己对严格模式的认识。下面是参考【javascript高级程序设计(第三版)】的内容。

1.严格模式(strict mode)

1.1 什么是严格模式

  ‘严格模式’最早引入是ECMAScript5。通过严格模式,可以在函数内部选择进行较为严格的全局或局部的错误条件检测。


【补充】ECMAScript各版本的划分,推荐:阮一峰老师中ECMAScript的历史介绍

1.2 使用严格模式的好处

可以提早知道代码中存在的错误,及早捕获一些可能导致编程错误的ECMAScript行为。

1.3 支持严格模式的浏览器

理解严格模式的规则非常重要,支持严格模式的浏览器有

  • IE 10+
  • Firefox 4+
  • Safari 5.1+
  • Chrome

2. 如何使用严格模式

当我们想要让自己编写的代码处在严格模式的时候,可以使用严格模式的编译指示(pragma),也就是一个不会赋给任何变量的字符串:'use strict'这就话需要放在想要处于严格模式的首句。

这种语法可以向后兼容那些不支持严格模式的javascript引擎。

  • 支持严格模式的引擎会启动这种模式
  • 不支持该模式的引擎就当遇到一个未赋值的字符串字面量,会忽略这个编译指示

如果在全局作用域中给出的这个编译指示,则整个脚本都将使用严格模式。也就是这个编译指示放在哪里,只要有javascript代码,就会让其处于严格模式。

在函数中使用严格模式。把’use strict’放在首位,就可以对整个函数其作用

function fn(){
   
  'use strict'
  //要实现的代码
}

【补充】字面量:
百度百科的解释

通俗理解:let a = 1;这个等号左边的叫做变量,等号右边的就叫做字面量

3. 页面中使用严格模式与不使用严格模式的区别

3.1 变量

在严格模式下,什么时候创建变量以及怎么创建变量都是有限制的。

3.1.1 不允许意外创建全局变量

未声明变量在严格模式非严格模式下的区别:

  • 非严格模式:即使message前面没有var关键字,也没有定义为全局对象的属性;也可以将它创建为全局变量
  • 严格模式 :如果给一个没有声明的变量赋值或者变量名拼写错误。那代码在执行的时候就会抛出ReferenceError这个错误
message = 'Hello World!'
console.log(window.message)  //'Hello World!'
'use strict'
message = 'Hello World!'
console.log(window.message);  //Uncaught ReferenceError: message2 is not defined
3.1.2 不能对变量调用delete操作符
  • 非严格模式:允许使用delete删除元素,但会静态默认失败(也就是删除不了,但是不会报错,哈哈)
  • 严格模式:删除变量也会导致错误
var color = 'red';
delete color;
console.log(color); //'red'
'use strict'
var color = 'red';
delete color;
console.log(color); //Uncaught SyntaxError: Delete of an unqualified identifier in strict mode. 
3.1.3 对变量名的限制

不能使用 implementsinterfaceletpackage
privateprotectedpublicstaticyield 作为变量名。这些都是保留字,将来的 ECMAScript
版本中可能会用到它们。

  • 非严格模式:使用上面的关键字不会报错,但是最好不要用(变量的命名规范中有一条就是不能使用JS中的关键字和保留字)
  • 严格模式下:用以上标识符作为变量名会导致语法错误。
var implements=1;
console.log(implements); //1
'use strict'
var implements=1;
console.log(implements);//Uncaught SyntaxError: Unexpected strict mode reserved word

3.2 对象

在严格模式下操作对象比在非严格模式下更容易导致错误。

  • 非严格模式下会静默失败的情形
  • 在严格模式下就会抛出错误

因此,在开发中使用严格模式会加大早发现错误的可能性。

3.2.1 在下列情形下操作对象的属性会导致错误:
  • 为只读属性赋值会抛出 TypeError
  • 对不可配置的(nonconfigurable)的属性使用 delete 操作符会抛出 TypeError
  • 为不可扩展的(nonextensible)的对象添加属性会抛出 TypeError
"use strict";

// 给不可写属性赋值
var obj1 = {
   };
Object.defineProperty(obj1
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值