严格模式(use strict)

目的

  1. 消除JS中一些不合理、不严谨之处,减少一些怪异行为
  2. 消除代码中的一些不安全之处,保障代码运行安全
  3. 提高编译器效率,增加运行速度
  4. 为以后的JS新规范做铺垫

兼容性

FF、Chrome、IE10+、Safari、Opera

语法

"use strict";

老版本浏览器将以上源码当做字符串处理

使用范围

  1. 在整个脚本之前调用,整段脚本以严格模式执行
    <script>
"use strict";
console.log('全局严格模式');
</script>
  1. 在函数内部之前调用,整个函数以严格模式执行
    function fn() {
"use strict";
console.log('局部严格模式,只在函数内有效');
}

对行为和语法的控制

  1. 全局变量显示声明

    • 正常模式下,变量没有声明,直接赋值,默认为全局变量;
    • 严格模式禁止这种行为,全局变量必须用var显式声明
    //正常模式下
a = 1;
console.log(a);//1
    //严格模式下
"use strict";
a = 1;
console.log(a);//报错
  1. 禁止使用with

    width语句在编译时无法确定属性归属于哪个对象
  2. 增加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
  1. this默认不指向全局对象window

    • 正常模式下,this指向window
    • 严格模式下,this不再默认指向window
    //正常模式下
function fn() {
this.a = 1;
}
fn();
a;//1
    //严格模式下
"use strict";
function fn() {
this.a = 1;
}
fn();
a;//报错
  1. argumentscaller被禁用

    • 正常模式下,函数本身拥有默认属性arguments指向传递的参数,caller指向函数引用;
    • 严格模式下,argumentscaller被禁用,报错
  2. 禁止删除变量
    • 正常模式下,delete可以删除定义的变量;
    • 严格模式下,只有configurabletrue的对象属性才能被删除,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;
  1. 对只读属性赋值,会报错

    • 正常模式下,对只读属性赋值时,不报错,只默认失败;
    • 严格模式下,报错
  2. getter方法赋值报错
  3. 对禁止扩展的对象添加新属性报错
  4. 删除不可删除的属性报错
  5. 对象不能有重名属性
    • 正常模式下,对象中重名属性会被后面的重名属性覆盖;
    • 严格模式下,语法错误,不会报错
  6. 函数不能有重名参数
    • 正常模式下,函数下有重名参数时,正常输出参数,重名参数被后面的重名参数覆盖,使用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);//报错
  1. 禁用八进制

    • 正常模式下,整数第一位如果是0,表示八进制,可正常转换输出对应的十进制数;
    • 严格模式下,报错
    //正常模式下
console.log(012);//10
    //严格模式下
'use strict';
console.log(012);//报错
  1. 不允许对arguments赋值

    • 正常模式下,可对arguments重新赋值;
    • 严格模式下,语法错误,参数值不会变
  2. 不再对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);
  1. arguments.callee被禁用

    • 正常模式下,arguments.callee指向函数引用;
    • 严格模式下,被禁用,报错
    //正常模式下
function fn(a) {
console.log(arguments.callee);
}
fn(1);//输出原函数体
	//严格模式下
'use strict';
function fn(a) {
console.log(arguments.callee);
}
fn(1);//报错
  1. 函数必须被声明在顶层

    • 正常模式下,函数可以被声明在iffor代码块内;
    • 严格模式下,不允许,报错
	//正常模式下
if(true) {
function fn(a) {
console.log(a);
}
}
fn(1);//1
	//严格模式下
'use strict';
if(true) {
function fn(a) {
console.log(a);
}
}
fn(1);//报错,函数不存在
  1. 新增保留字

    • 严格模式下,新增关键字implementsinterfaceletpackageprivateprotectedpublicstaticyield

JavaScript严格模式说明带示例的更多相关文章

  1. 面向对象的JavaScript --- 原型模式和基于原型继承的JavaScript对象系统

    面向对象的JavaScript --- 原型模式和基于原型继承的JavaScript对象系统 原型模式和基于原型继承的JavaScript对象系统 在 Brendan Eich 为 JavaScrip ...

  2. JavaScript dotAll模式

    JavaScript正则表达式中点(.)是一个特殊字符,它可以匹配除了一下条件的任意字符. 四个字节的UTF-16字符 换行符(\n) 回车符(\r) 行分隔符 段分隔符 为了使点(.)可以匹配任意字 ...

  3. javascript运行模式:并发模型 与Event Loop

    看了阮一峰老师的JavaScript 运行机制详解:再谈Event Loop和[朴灵评注]的文章,查阅网上相关资料,把自己对javascript运行模式和EVENT loop的理解整理下,不一定对,日 ...

  4. Javascript原型模式总结梳理

    在大多数面向对象语言中,对象总是由类中实例化而来,类和对象的关系就像模具跟模件一样.Javascript中没有类的概念,就算ES6中引入的class也不过是一种语法糖,本质上还是利用原型实现.在原型编 ...

  5. JavaScript严格模式详解

    转载自阮一峰的博客 Javascript 严格模式详解   作者: 阮一峰 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict m ...

  6. (转)深入理解JavaScript 模块模式

    深入理解JavaScript 模块模式 (原文)http://www.cnblogs.com/starweb/archive/2013/02/17/2914023.html 英文:http://www ...

  7. JavaScript严谨模式(Strict Mode)

    下面的内容翻译自It’s time to start using JavaScript strict mode,作者Nicholas C.Zakas参与了YUI框架的开发,并撰写了多本前端技术书籍,在 ...

  8. 深入理解JavaScript 模块模式

    http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html 模块模式是JavaScript一种常用的编码模式.这是一般的 ...

  9. Javascript编程模式(JavaScript Programming Patterns)Part 1.(初级篇)

    JavaScript 为网站添加状态,这些状态可能是校验或者更复杂的行为像拖拽终止功能或者是异步的请求webserver (aka Ajax). 在过去的那些年里, JavaScript librar ...

随机推荐

  1. Memcached源码分析之thread.c

    /* * 文件开头先啰嗦几句: * * thread.c文件代表的是线程模块.但是你会看到这个模块里面有很多其它方法, 例如关于item的各种操作函数,item_alloc,item_remove,i ...

  2. iOS中UITextField 使用全面解析 分类: ios技术 2015-04-10 14:37 153人阅读 评论(0) 收藏

    //初始化textfield并设置位置及大小   UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 13 ...

  3. PHPCMS快速建站系列之自定义分页函数

    内容分页的实现方法:{pc:content action="lists" catid="$catid" order="id DESC" nu ...

  4. JS脚本语言(全称java script:网页里使用的脚本语言:非常强大的语言):基础语法

    一.注释语法 1.单行注释// 2.多行注释/**/ 二.语法输出 1.alert(信息):弹出信息 2.confirm(信息):弹出一个和用户交互的对话框 3.prompt(信息):弹出一个可以让用 ...

  5. selenium Chromediver

    Here we use wget to fetch the version number of the latest release, then plug the version into anoth ...

  6. 谈谈jconsole和jvisualvm

    环境Eclipse-Mars ,JDK1.7 JConsole 一.首先需要配置参数 参数有两种配置连接方式:(原理我还不太懂) 1.在eclipse中添加 项目右键-->>Debug a ...

  7. iOS 沙盒

    1. 概念 某个应用程序的非代码文件存放空间. 2. 文件结构 每个沙盒有三个文件夹: Documents: 存放文件 Library: 存放默认设置或状态信息.Library/caches: 缓存文 ...

  8. METRO风格

    METRO风格是指微软在WINDOWS PHONE 7中新加入的界面风格,并且计划将其用于windows8中的开始菜单界面.该界面的特点是简洁高效,每一个METRO图标都没有边框,形状有点像地铁站中的 ...

  9. js架构设计模式——由项目浅谈JS中MVVM模式

    1.    背景 最近项目原因使用了durandal.js和knockout.js,颇有受益.决定写一个比较浅显的总结. 之前一直在用SpringMVC框架写后台,前台是用JSP+JS+标签库,算是很 ...

  10. MFC中在基于对话框的窗体中使用CFileDialog导致菜单栏变灰的解决方案

    CSDN的博客编辑器实在是难用……转战博客园 直接把CSDN发的搬过来了 ————————————————————————————我是分割线———————————————————————————— 第 ...