Javascript 严格模式use strict详解


Posted in Javascript onSeptember 16, 2017

严格模式:由ECMA-262规范定义的JavaScript标准,对javascrip的限制更强。

(非严格的模式,被称为“马虎模式/稀松模式/懒散模式”。)

一、严格模式的使用

严格模式可以在脚本或函数级别实现。(即全局和局部模式)

1.全局

在js文件的最前面添加    "use strict"

2.局部

在函数内部添加   "use strict",如下

function fn() {
  "use strict";
  //some code
}

二、严格模式和非严格模式的对比

1.严格模式下,无法删除(delete)变量(delete是不合格的标识符))。非严格模式下会删除失败返回false

"use strict";
var x;
delete x;//报错Delete of an unqualified identifier in strict mode.(不合格的标识符)

2.严格模式中,函数形参存在同名的,抛出错误; 非严格模式不会

严格模式下

function fn(a,a){
 "use strict";
  result=a+a;
  console.log(result);
}
fn(2,4);//Duplicate parameter name not allowed in this context(重复的参数名称在此上下文中不允许)

非严格模式下

function fn1(a,a){
  "use strict";
  result=a+a;
  console.log(result);
}
fn1(2,4);//结果为8

3.严格模式不允许八进制整数直接量(如下)。非严格模式下不会报错。

"use strict"
var x=089;
console.log(x);//报错:Decimals with leading zeros are not allowed in strict mode.

4.严格模式中,arguments对象是传入函数内实参列表的静态副本(即不再追踪参数的变化);非严格模式下,arguments对象里的元素和对应的实参是指向同一个值的引用。

严格模式下

fn(5);
function fn(a){
  "use strict";
  a = 42;
  // return a==arguments[0];//返回false
  console.log(a);//结果为42
  console.log(arguments[0]);//结果为5,严格模式下arguments[0]表示这个调用方法的第一个参数     (不再追踪  参数的变化,在函数内部,参数a被重新赋值为42,但arguments[0]仍然为5.)
}

非严格模式下

fn(5);
function fn(a){
  a = 42;
  // return a==arguments[0];//返回true
  console.log(a);//结果为42
  console.log(arguments[0]);//结果为42(追踪参数变化)

}

5.严格模式中 eval和arguments当做关键字,它们不能被赋值和用作变量声明

"use strict";
var eval=3;//报错:Unexpected eval or arguments in strict mode
var argument=6;//同样报错

6.严格模式会限制对调用栈的检测能力,访问arguments.callee,arguments.callee.caller会抛出异常

严格模式下:

"use strict";
function fn(n){
  if(n==0){
    return 1;
  }else{
    return n*arguments.callee(n-1);
  }
}
console.log(fn(5));//报错

非严格模式下:

function fn(n){//阶乘
  if(n==0){
    return 1;
  }else{
    return n*arguments.callee(n-1);
  }
}
console.log(fn(5));//正常120

caller:在一个函数调用另一个函数时,被调用函数会自动生成一个caller属性,指向调用它的函数对象。如果该函数当前未被调用,或并非被其他函数调用,

则caller为null。如下:

严格模式下:

"use strict"
function fn1() {
  var n1= fn1.caller;
  console.log(n1);
}
function fn2() {
  fn1();
}
fn2();//报错

非严格模式下:

function fn1() {
  var n1= fn1.caller;//此例中caller指向调用它的函数(fn2)
  console.log(n1);
}
function fn2() {
  fn1();
}
fn2();// 结果打印出:function fn2(){ fn1( ) };

7.严格模式变量必须先声明,直接给变量赋值,不会隐式创建全局变量,不能用with。

严格模式下

"use strict";
with(obj){
  x;
}//报错:Strict mode code may not include a with statement

解释:道运行脚本时,首先是编译,然后再执行。显然在编译的时候,所以就不能在编译时确定with语句块中的变量到底归属哪个对象。[with语句块中的变量是(cl)的属性

还是上一层变量作用域链中的变量。]。只能在执行时才能确定(c1)是Clothes的一个实例。这与严格模式有编译时就检查变量是否定义冲突,所以严格模式不会with语句的使用。

扩展:with语句的使用(用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性。)

with(object instance)
{
  //代码块
}
eg:function Clothes(){
  this.color="red";
  this.size="m";
  this.price="cheap";
}
var c1=new Clothes();
with(c1){
  var str="颜色:"+color+",尺寸:"+size+",价格:"+price;
  document.write(str);
}//结果(颜色:red,尺寸:m,价格:cheap)

严格模式中 call apply传入null undefined保持原样不被转换为window

总结

以上所述是小编给大家介绍的Javascript 严格模式use strict详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言小编会及时回复大家的!

Javascript 相关文章推荐
CCPry JS类库 代码
Oct 30 Javascript
理解Javascript_02_理解undefined和null
Oct 11 Javascript
js focus不起作用的解决方法(主要是因为dom元素是否加载完成)
Nov 05 Javascript
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
Jan 24 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
Oct 22 Javascript
Node.js重新刷新session过期时间的方法
Feb 04 Javascript
JavaScript来实现打开链接页面的简单实例
Jun 02 Javascript
jQuery实现的图片轮播效果完整示例
Sep 12 Javascript
js+html5实现页面可刷新的倒计时效果
Jul 15 Javascript
ES6下子组件调用父组件的方法(推荐)
Feb 23 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
May 03 jQuery
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
Mar 29 Javascript
ES6中Array.copyWithin()函数的用法实例详解
Sep 16 #Javascript
JS闭包的几种常见形式实例详解
Sep 16 #Javascript
ES6中Array.find()和findIndex()函数的用法详解
Sep 16 #Javascript
详解JS构造函数中this和return
Sep 16 #Javascript
Angular使用Md5加密的解决方法
Sep 16 #Javascript
使用JS实现气泡跟随鼠标移动的动画效果
Sep 16 #Javascript
EasyUI创建人员树的实例代码
Sep 15 #Javascript
You might like
PHP base64+gzinflate压缩编码和解码代码
2008/10/03 PHP
Zend Framework动作助手FlashMessenger用法详解
2016/03/05 PHP
PHP实现支持加盐的图片加密解密
2016/09/09 PHP
详解PHP编码转换函数应用技巧
2016/10/22 PHP
基于PHP的微信公众号的开发流程详解
2020/08/07 PHP
document 和 document.all 分别什么时候用
2006/06/22 Javascript
Javascript中暂停功能的实现代码
2007/03/04 Javascript
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
2012/05/23 Javascript
js数组转json并在后台对其解析具体实现
2013/11/20 Javascript
jQuery实现个性翻牌效果导航菜单的方法
2015/03/09 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
2016/08/24 Javascript
javascript cookie基础应用之记录用户名的方法
2016/09/20 Javascript
javascript入门之window对象【新手必看】
2016/11/22 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
2017/02/19 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
AngularJS2中一种button切换效果的实现方法(二)
2017/03/27 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
2019/09/18 Javascript
仅利用30行Python代码来展示X算法
2015/04/01 Python
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
Python实现SVN的目录周期性备份实例
2015/07/17 Python
Python通过DOM和SAX方式解析XML的应用实例分享
2015/11/16 Python
Python实现加载及解析properties配置文件的方法
2018/03/29 Python
python判断数字是否是超级素数幂
2018/09/27 Python
Python日志无延迟实时写入的示例
2019/07/11 Python
python按修改时间顺序排列文件的实例代码
2019/07/25 Python
pytorch实现MNIST手写体识别
2020/02/14 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
2020/06/10 Python
Idea安装python显示无SDK问题解决方案
2020/08/12 Python
Pycharm2020最新激活码|永久激活(附最新激活码和插件的详细教程)
2020/09/29 Python
Python高并发和多线程有什么关系
2020/11/14 Python
Python爬虫后获取重定向url的两种方法
2021/01/19 Python
美国工业用品采购网站:Zoro.com
2020/10/27 全球购物
商务考察邀请函范文
2014/01/21 职场文书
关于运动会的稿件
2014/02/02 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书