严格模式是指使代码在严格条件下运行。如果你在JavaScript脚本的头部看到“use strict”,那么就表明当前处于严格模式下。严格模式主要是为了消除JavaScript语法的一些不合理和怪异之处。

严格模式主要有以下限制:

  1. 变量必须先声明后使用,且无法删除,不能重复
"use strict"
a = 1; //报错 Uncaught ReferenceError: a is not defined var b = 1;
delete b;//报错 Uncaught SyntaxError: Delete of an unqualified identifier in strict mode. function foo(p1, p1){} //报错 Uncaught SyntaxError: Duplicate parameter name not allowed in this context

2.不能使用with语句

with语句用于暂时修改作用域链,语法如下:

with (Object)
statement

废弃with的主要原因是因为它在引用对象时不可预测,使得代码难以优化,并且还会拖慢代码的执行速度。

3.不能对只读属性赋值,不能删除不可删除的属性

var obj = {};
obj.defineProperty(obj, 'a', {value:1, writable: false});//writable=false使属性不可写
obj.a = 2; //报错 Uncaught TypeError: Cannot assign to read only property 'a' of object '#<Object>' delete Object.prototype //报错 Uncaught TypeError: Cannot delete property 'prototype' of function Object() { [native code] }

4.不能使用八进制数和转义字符

var a = 010; //报错 Uncaught SyntaxError: Octal literals are not allowed in strict mode.
var a = \010; //报错 Uncaught SyntaxError: Invalid or unexpected token

5.eval不能被重新赋值,在作用域 eval() 创建的变量不能被调用

var eval = 1;//报错 Uncaught SyntaxError: Unexpected eval or arguments in strict mode
eval('var a = 1')
console.log(a) //报错 Uncaught ReferenceError: a is not defined

6.arguments不能被重新赋值,不会自动反映函数参数的变化

var arguments = 1;//报错 Uncaught SyntaxError: Unexpected eval or arguments in strict mode

7.禁止this指向全局对象

在严格模式下,顶层this指向undefined,而不再指向全局对象。

function foo1(){
return this; //返回Window对象
}
function foo2(){
"use strict";
return this; //返回undefined
}

8.不能使用arguments.calleearguments.caller

arguments.callee通常用在函数的递归调用中,废弃的原因主要是因为它在每次递归调用时都需要重新创建,不仅影响性能,还会影响闭包。详细说明可以查看MDN文档

arguments.caller属性用在函数执行的时候调用自身。废弃的原因是因为其潜在的不安全性。

9.不能使用fn.callerfn.arguments获取函数调用的堆栈

fn.caller返回的是函数的调用者,当一个函数fn在全局作用域内被调用时,fn.callernull,当一个函数fn在另外一个函数作用域内被调用的,fn.caller则指向调用它的那个函数。

fn.arguments代表传入函数的实参,已被废弃,可以使用函数内部的arguments对象代替。

详细可参见MDN文档

10.增加了保留字,包括publicprivateprotectedstaticletyieldpackageinterfaceimplements

"use strict" 指令只允许出现在脚本或函数的开头,并且在ES6的模块中自动采用严格模式。

不管是否使用严格模式,都应该按照严格模式的标准来书写代码,这样可使得代码更加安全、稳定。

Javascript严格模式与一般模式的区别的更多相关文章

  1. <JavaScript> 稳妥构造函数模式与工厂模式的区别

    稳妥构造函数模式的代码应该是这样的: function Person(name, age, job) { var o = new Object(); // private members var na ...

  2. 大型 JavaScript 应用架构中的模式

    原文:Patterns For Large-Scale JavaScript Application Architecture by @Addy Osmani 今天我们要讨论大型 JavaScript ...

  3. [转]大型 JavaScript 应用架构中的模式

    目录 1.我是谁,以及我为什么写这个主题 2.可以用140个字概述这篇文章吗? 3.究竟什么是“大型”JavaScript应用程序? 4.让我们回顾一下当前的架构 5.想得长远一些 6.头脑风暴 7. ...

  4. 初涉JavaScript模式 (11) : 模块模式

    引子 这篇算是对第9篇中内容的发散和补充,当时我只是把模块模式中的一些内容简单的归为函数篇中去,在北川的提醒下,我才发觉这是非常不严谨的,于是我把这些内容拎出来,这就是这篇的由来. 什么是模块模式 在 ...

  5. JavaScript函数的各种调用模式

    函数是JavaScript世界里的第一公民,换句话来说,就是我们如果可以精通JavaScript函数的使用,那么对JavaScript的运用可以更游刃有余了.熟悉JavaScript的人应该都知道,同 ...

  6. 再起航,我的学习笔记之JavaScript设计模式06(抽象工厂模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...

  7. 【JavaScript】 JS面向对象的模式与实践 (重点整治原型这个熊孩子 (/= _ =)/~┴┴ )

    参考书籍 <JavaScript高级语言程序设计>—— Nicholas C.Zakas <你不知道的JavaScript>  —— KYLE SIMPSON   在JS的面向 ...

  8. 观察者模式(Observer)和发布(Publish/订阅模式(Subscribe)的区别

    观察者模式(Observer)和发布(Publish/订阅模式(Subscribe)的区别 在翻阅资料的时候,有人把观察者(Observer)模式等同于发布(Publish)/订阅(Subscribe ...

  9. 再起航,我的学习笔记之JavaScript设计模式07(抽象工厂模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...

  10. javascript创建对象的方法--构造函数模式

    javascript创建对象的方法--构造函数模式 一.总结 构造函数模式作用和不足 1.作用:解决工厂模式不是用new关键字来创建对象的弊端 2.作用:解决工厂模式创建的实例和模型没有内在联系的问题 ...

随机推荐

  1. 文献管理软件 Zotero 安装、配置与使用

    简介 Zotero优缺点 使用Zotero作为主力文献管理工具的原因: 软件本身完全免费并且开源,不存在盗版问题 注册后本身只包括 300M 空间同步,但支持 WebDAV 同步,例如 Dropbox ...

  2. [阿里DIN] 从论文源码学习 之 embedding层如何自动更新

    [阿里DIN] 从论文源码学习 之 embedding层如何自动更新 目录 [阿里DIN] 从论文源码学习 之 embedding层如何自动更新 0x00 摘要 0x01 DIN源码 1.1 问题 1 ...

  3. SpringBoot第三集:热部署与单元测试(2020最新最易懂)

    SpringBoot第三集:热部署与单元测试(2020最新最易懂) 有兴趣的可以先参考附录简单了解SpringBoot自动装配流程. 一.SpringBoot开发热部署 项目开发中,你是否也遇到更新配 ...

  4. 三年工作经验,从小厂离职后,我凭什么拿到了阿里的offer

    本篇文章主要记录分享我的面试准备过程. 很多朋友问我为什么离职 关于离职原因,马云有一句经典的话"要么钱没给到位,要么心委屈了",想必大家耳熟能详了,我这里再细说一下我个人离职原因 ...

  5. 关于LoRa安全联盟的六大常见问题

    LoRaWAN的安全机制在哪里指定? 所有安全机制都在LULA联盟规范中指定,可以由公众下载. LoRa联盟规范如何保证LoRaWAN网络的安全操作? LoRaWAN支持来源认证.完整的媒体访问控制( ...

  6. Java学习的第三十一天

    1.使用RandomAccessFile随机读写文件 2.没有问题 3.明天学习综合实例

  7. Cobalt Strike使用的一些技巧

    利用msf模块上线beacon shell 当通过CS的mimikatz或者其他方式获得了目标机器的明文密码或者哈希时,可以利用metasploit的psexec_command模块来上线CS的bea ...

  8. Python + Appium 自动化操作微信入门看这一篇就够了

    简介 Appium 是一个开源的自动化测试工具,支持 Android.iOS 平台上的原生应用,支持 Java.Python.PHP 等多种语言. Appium 封装了 Selenium,能够为用户提 ...

  9. 3、Django之路由层

    一 路由的作用 路由即请求地址与视图函数的映射关系,如果把网站比喻为一本书,那路由就好比是这本书的目录,在Django中路由默认配置在urls.py中. 二 简单的路由配置 # urls.py fro ...

  10. 想更改Github仓库中的某个文件结构

    虽然有各种版本回退啥的,可是感觉好麻烦,还是没搞来,后来发现可以直接先删除,然后在本地更改,更改完之后重新添加一次即可 删除远程库的某个文件: $ git pull origin master 将远程 ...