Javascript严格模式与一般模式的区别
严格模式是指使代码在严格条件下运行。如果你在JavaScript脚本的头部看到“use strict”,那么就表明当前处于严格模式下。严格模式主要是为了消除JavaScript语法的一些不合理和怪异之处。
严格模式主要有以下限制:
- 变量必须先声明后使用,且无法删除,不能重复
"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.callee
和arguments.caller
arguments.callee
通常用在函数的递归调用中,废弃的原因主要是因为它在每次递归调用时都需要重新创建,不仅影响性能,还会影响闭包。详细说明可以查看MDN文档。
arguments.caller
属性用在函数执行的时候调用自身。废弃的原因是因为其潜在的不安全性。
9.不能使用fn.caller
和fn.arguments
获取函数调用的堆栈
fn.caller
返回的是函数的调用者,当一个函数fn在全局作用域内被调用时,fn.caller
为null
,当一个函数fn在另外一个函数作用域内被调用的,fn.caller
则指向调用它的那个函数。
fn.arguments
代表传入函数的实参,已被废弃,可以使用函数内部的arguments
对象代替。
详细可参见MDN文档。
10.增加了保留字,包括public
、private
、protected
、static
、let
、yield
、package
、interface
、implements
。
"use strict"
指令只允许出现在脚本或函数的开头,并且在ES6的模块中自动采用严格模式。
不管是否使用严格模式,都应该按照严格模式的标准来书写代码,这样可使得代码更加安全、稳定。
Javascript严格模式与一般模式的区别的更多相关文章
- <JavaScript> 稳妥构造函数模式与工厂模式的区别
稳妥构造函数模式的代码应该是这样的: function Person(name, age, job) { var o = new Object(); // private members var na ...
- 大型 JavaScript 应用架构中的模式
原文:Patterns For Large-Scale JavaScript Application Architecture by @Addy Osmani 今天我们要讨论大型 JavaScript ...
- [转]大型 JavaScript 应用架构中的模式
目录 1.我是谁,以及我为什么写这个主题 2.可以用140个字概述这篇文章吗? 3.究竟什么是“大型”JavaScript应用程序? 4.让我们回顾一下当前的架构 5.想得长远一些 6.头脑风暴 7. ...
- 初涉JavaScript模式 (11) : 模块模式
引子 这篇算是对第9篇中内容的发散和补充,当时我只是把模块模式中的一些内容简单的归为函数篇中去,在北川的提醒下,我才发觉这是非常不严谨的,于是我把这些内容拎出来,这就是这篇的由来. 什么是模块模式 在 ...
- JavaScript函数的各种调用模式
函数是JavaScript世界里的第一公民,换句话来说,就是我们如果可以精通JavaScript函数的使用,那么对JavaScript的运用可以更游刃有余了.熟悉JavaScript的人应该都知道,同 ...
- 再起航,我的学习笔记之JavaScript设计模式06(抽象工厂模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...
- 【JavaScript】 JS面向对象的模式与实践 (重点整治原型这个熊孩子 (/= _ =)/~┴┴ )
参考书籍 <JavaScript高级语言程序设计>—— Nicholas C.Zakas <你不知道的JavaScript> —— KYLE SIMPSON 在JS的面向 ...
- 观察者模式(Observer)和发布(Publish/订阅模式(Subscribe)的区别
观察者模式(Observer)和发布(Publish/订阅模式(Subscribe)的区别 在翻阅资料的时候,有人把观察者(Observer)模式等同于发布(Publish)/订阅(Subscribe ...
- 再起航,我的学习笔记之JavaScript设计模式07(抽象工厂模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...
- javascript创建对象的方法--构造函数模式
javascript创建对象的方法--构造函数模式 一.总结 构造函数模式作用和不足 1.作用:解决工厂模式不是用new关键字来创建对象的弊端 2.作用:解决工厂模式创建的实例和模型没有内在联系的问题 ...
随机推荐
- 文献管理软件 Zotero 安装、配置与使用
简介 Zotero优缺点 使用Zotero作为主力文献管理工具的原因: 软件本身完全免费并且开源,不存在盗版问题 注册后本身只包括 300M 空间同步,但支持 WebDAV 同步,例如 Dropbox ...
- [阿里DIN] 从论文源码学习 之 embedding层如何自动更新
[阿里DIN] 从论文源码学习 之 embedding层如何自动更新 目录 [阿里DIN] 从论文源码学习 之 embedding层如何自动更新 0x00 摘要 0x01 DIN源码 1.1 问题 1 ...
- SpringBoot第三集:热部署与单元测试(2020最新最易懂)
SpringBoot第三集:热部署与单元测试(2020最新最易懂) 有兴趣的可以先参考附录简单了解SpringBoot自动装配流程. 一.SpringBoot开发热部署 项目开发中,你是否也遇到更新配 ...
- 三年工作经验,从小厂离职后,我凭什么拿到了阿里的offer
本篇文章主要记录分享我的面试准备过程. 很多朋友问我为什么离职 关于离职原因,马云有一句经典的话"要么钱没给到位,要么心委屈了",想必大家耳熟能详了,我这里再细说一下我个人离职原因 ...
- 关于LoRa安全联盟的六大常见问题
LoRaWAN的安全机制在哪里指定? 所有安全机制都在LULA联盟规范中指定,可以由公众下载. LoRa联盟规范如何保证LoRaWAN网络的安全操作? LoRaWAN支持来源认证.完整的媒体访问控制( ...
- Java学习的第三十一天
1.使用RandomAccessFile随机读写文件 2.没有问题 3.明天学习综合实例
- Cobalt Strike使用的一些技巧
利用msf模块上线beacon shell 当通过CS的mimikatz或者其他方式获得了目标机器的明文密码或者哈希时,可以利用metasploit的psexec_command模块来上线CS的bea ...
- Python + Appium 自动化操作微信入门看这一篇就够了
简介 Appium 是一个开源的自动化测试工具,支持 Android.iOS 平台上的原生应用,支持 Java.Python.PHP 等多种语言. Appium 封装了 Selenium,能够为用户提 ...
- 3、Django之路由层
一 路由的作用 路由即请求地址与视图函数的映射关系,如果把网站比喻为一本书,那路由就好比是这本书的目录,在Django中路由默认配置在urls.py中. 二 简单的路由配置 # urls.py fro ...
- 想更改Github仓库中的某个文件结构
虽然有各种版本回退啥的,可是感觉好麻烦,还是没搞来,后来发现可以直接先删除,然后在本地更改,更改完之后重新添加一次即可 删除远程库的某个文件: $ git pull origin master 将远程 ...