JavaScript严格模式说明带示例
严格模式(use strict)
目的
- 消除JS中一些不合理、不严谨之处,减少一些怪异行为
 - 消除代码中的一些不安全之处,保障代码运行安全
 - 提高编译器效率,增加运行速度
 - 为以后的JS新规范做铺垫
 
兼容性
FF、Chrome、IE10+、Safari、Opera
语法
"use strict";
老版本浏览器将以上源码当做字符串处理
使用范围
- 在整个脚本之前调用,整段脚本以严格模式执行
 
    <script>
    "use strict";
    console.log('全局严格模式');
    </script>
- 在函数内部之前调用,整个函数以严格模式执行
 
    function fn() {
        "use strict";
        console.log('局部严格模式,只在函数内有效');
    }
对行为和语法的控制
- 全局变量显示声明
- 正常模式下,变量没有声明,直接赋值,默认为全局变量;
 - 严格模式禁止这种行为,全局变量必须用
var显式声明 
 
    //正常模式下
    a = 1;
    console.log(a);//1
    //严格模式下
    "use strict";
    a = 1;
    console.log(a);//报错
- 禁止使用
with
width语句在编译时无法确定属性归属于哪个对象 - 增加
eval作用域- 正常模式下,
eval中执行的作用于取决于它处于全局还是函数作用域内; - 严格模式下,
eval本身有独立的作用域 
 - 正常模式下,
 
	//正常模式下
    var a = 1;
    console.log(eval('var a = 1;a'));//2
    console.log(a);//2
	//严格模式下
    var a = 1;
    console.log(eval('var a = 2;a'));//2
    console.log(a);//1
this默认不指向全局对象window- 正常模式下,
this指向window; - 严格模式下,
this不再默认指向window 
- 正常模式下,
 
    //正常模式下
    function fn() {
        this.a = 1;
    }
    fn();
    a;//1
    //严格模式下
    "use strict";
    function fn() {
        this.a = 1;
    }
    fn();
    a;//报错
arguments和caller被禁用- 正常模式下,函数本身拥有默认属性
arguments指向传递的参数,caller指向函数引用; - 严格模式下,
arguments和caller被禁用,报错 
- 正常模式下,函数本身拥有默认属性
 - 禁止删除变量
- 正常模式下,
delete可以删除定义的变量; - 严格模式下,只有
configurable为true的对象属性才能被删除,var定义的变量不能被删除 
 - 正常模式下,
 
	//正常模式下
    var a = 1;
    delete a;//a不会被删除,也不报错
    a;//1
    var obj = {
        o1: 1,
        o2: 2
    };
    delete obj.o1;//obj中o1属性被删除
    obj.o1;//undefined;
	//严格模式下
    "use strict";
    var a = 1;
    delete a;//报错
    a;//1
    var obj = {
        o1: 1,
        o2: 2
    };
    delete obj.o1;
    obj.o1;//undefined;
- 对只读属性赋值,会报错
- 正常模式下,对只读属性赋值时,不报错,只默认失败;
 - 严格模式下,报错
 
 - 对
getter方法赋值报错 - 对禁止扩展的对象添加新属性报错
 - 删除不可删除的属性报错
 - 对象不能有重名属性
- 正常模式下,对象中重名属性会被后面的重名属性覆盖;
 - 严格模式下,语法错误,不会报错
 
 - 函数不能有重名参数
- 正常模式下,函数下有重名参数时,正常输出参数,重名参数被后面的重名参数覆盖,使用
arguments输出时,可区分参数值; - 严格模式下,报错
 
 - 正常模式下,函数下有重名参数时,正常输出参数,重名参数被后面的重名参数覆盖,使用
 
    //正常模式下
    function fn(a, a, b) {
        console.log(a);
        console.log(arguments[0]);
        console.log(arguments[1]);
    }
    fn(1,2,3);//2 1 2
	//严格模式下
    "use strict";
    function fn(a, a, b) {
        console.log(a);
        console.log(arguments[0]);
        console.log(arguments[1]);
    }
    fn(1,2,3);//报错
- 禁用八进制
- 正常模式下,整数第一位如果是
0,表示八进制,可正常转换输出对应的十进制数; - 严格模式下,报错
 
 - 正常模式下,整数第一位如果是
 
    //正常模式下
    console.log(012);//10
    //严格模式下
    'use strict';
    console.log(012);//报错
- 不允许对
arguments赋值- 正常模式下,可对
arguments重新赋值; - 严格模式下,语法错误,参数值不会变
 
 - 正常模式下,可对
 - 不再对
arguments跟踪变化- 正常模式下,函数参数值发生变化时,
arguments也随之变化; - 严格模式下,不变
 
 - 正常模式下,函数参数值发生变化时,
 
    //正常模式下
    function fn(a, b, c) {
        arguments[1] = 4;
        console.log(a, b, c);//1, 4, 3
        console.log(arguments[1]);//4
    }
    fn(1, 2, 3);
    //严格模式下
    'use strict';
    function fn(a, b, c) {
        arguments[1] = 4;
        console.log(a, b, c);//1, 2, 3
        console.log(arguments[1]);//4
    }
    fn(1, 2, 3);
arguments.callee被禁用- 正常模式下,
arguments.callee指向函数引用; - 严格模式下,被禁用,报错
 
- 正常模式下,
 
    //正常模式下
    function fn(a) {
        console.log(arguments.callee);
    }
    fn(1);//输出原函数体
	//严格模式下
    'use strict';
    function fn(a) {
        console.log(arguments.callee);
    }
    fn(1);//报错
- 函数必须被声明在顶层
- 正常模式下,函数可以被声明在
if或for代码块内; - 严格模式下,不允许,报错
 
 - 正常模式下,函数可以被声明在
 
	//正常模式下
    if(true) {
        function fn(a) {
            console.log(a);
        }
    }
    fn(1);//1
	//严格模式下
    'use strict';
    if(true) {
        function fn(a) {
            console.log(a);
        }
    }
    fn(1);//报错,函数不存在
- 新增保留字
- 严格模式下,新增关键字
implements、interface、let、package、private、protected、public、static、yield 
 - 严格模式下,新增关键字
 
JavaScript严格模式说明带示例的更多相关文章
- 面向对象的JavaScript --- 原型模式和基于原型继承的JavaScript对象系统
		
面向对象的JavaScript --- 原型模式和基于原型继承的JavaScript对象系统 原型模式和基于原型继承的JavaScript对象系统 在 Brendan Eich 为 JavaScrip ...
 - JavaScript dotAll模式
		
JavaScript正则表达式中点(.)是一个特殊字符,它可以匹配除了一下条件的任意字符. 四个字节的UTF-16字符 换行符(\n) 回车符(\r) 行分隔符 段分隔符 为了使点(.)可以匹配任意字 ...
 - javascript运行模式:并发模型 与Event Loop
		
看了阮一峰老师的JavaScript 运行机制详解:再谈Event Loop和[朴灵评注]的文章,查阅网上相关资料,把自己对javascript运行模式和EVENT loop的理解整理下,不一定对,日 ...
 - Javascript原型模式总结梳理
		
在大多数面向对象语言中,对象总是由类中实例化而来,类和对象的关系就像模具跟模件一样.Javascript中没有类的概念,就算ES6中引入的class也不过是一种语法糖,本质上还是利用原型实现.在原型编 ...
 - JavaScript严格模式详解
		
转载自阮一峰的博客 Javascript 严格模式详解 作者: 阮一峰 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict m ...
 - (转)深入理解JavaScript 模块模式
		
深入理解JavaScript 模块模式 (原文)http://www.cnblogs.com/starweb/archive/2013/02/17/2914023.html 英文:http://www ...
 - JavaScript严谨模式(Strict Mode)
		
下面的内容翻译自It’s time to start using JavaScript strict mode,作者Nicholas C.Zakas参与了YUI框架的开发,并撰写了多本前端技术书籍,在 ...
 - 深入理解JavaScript 模块模式
		
http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html 模块模式是JavaScript一种常用的编码模式.这是一般的 ...
 - Javascript编程模式(JavaScript Programming Patterns)Part 1.(初级篇)
		
JavaScript 为网站添加状态,这些状态可能是校验或者更复杂的行为像拖拽终止功能或者是异步的请求webserver (aka Ajax). 在过去的那些年里, JavaScript librar ...
 
随机推荐
- 3D VR卡镜的使用方法
			
先把它展开 然后把它卡在手机中间 介绍一个VR游戏资源 Chair In a Room,这是一个立体沉浸式的3D游戏,原理是陀螺仪传感器随着手机转动可以观察整个三维房间 如图所示,点击进入,将两眼放到 ...
 - ucos互斥信号量解决优先级反转问题
			
在可剥夺性的内核中,当任务以独占方式使用共享资源的时候,会出现低优先级任务高于高优先级任务运行的情况,这种情况叫做优先级反转,对于实时操作系统而言,这是一场灾难,下面我们来说说优先级反转的典型环境. ...
 - 如何获得keyhash
			
keyhash是由keystore产生的 三个命令解决问题 keytool -exportcert -alias androiddebugkey -keystore debug.keystore &g ...
 - MPU6050首例整合性6轴的姿态模块(转)
			
源:MPU6050首例整合性6轴的姿态模块 Mpu6050为全球首例整合3轴陀螺仪.3轴加速器.含9轴融合演:MPU-6000为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速 ...
 - foreach笔记
			
结合泛型使用,不然就只能写成for(Object o : T). 缺点是没有下标,如下面代码 public class ForeachTest { public static void main(St ...
 - cocos2d-x介绍
			
总体来说,cocos2d-x是一个优秀的库. Cocos2d-x没有很复杂的一个架构,基本上是一些以单件形式提供的管理器和是一些围绕SceneGraph(CCNode及其派生类)展开的类.这个设计使得 ...
 - easyui 翻译
			
1,DataGrid checkOnSelect: 设置成true:用户点击一行的时候,复选框被选中或者是取消选中 设置成false:只有当用户点击复选框的时候,复选框才能被选中或者是取消选中 sel ...
 - C#索引器的用法
			
索引器允许类或者结构的实例按照与数组相同的方式进行索引取值,索引器与属性类似,不同的是索引器的访问是带参的. 索引器和数组比较: (1)索引器的索引值(Index)类型不受限制 (2)索引器允许重载 ...
 - violin 结构介绍
			
参考:http://www.iqiyi.com/w_19rt9yvv9p.html 主要结构有:琴身.指板.腮托.琴马.琴弦.琴轴
 - 1.4.2.1. FILES(Core Data 应用程序实践指南)
			
#define debug 1 #pragma mark - FILES NSString *storeFilename = @"Grocery-Dude.sqlite";