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 相关文章推荐
JavaScript DOM 学习第九章 选取范围的介绍
Feb 19 Javascript
Javascript执行效率全面总结
Nov 04 Javascript
javascript设计模式之工厂模式示例讲解
Mar 04 Javascript
jquery 实现两级导航菜单附效果图
Mar 07 Javascript
js设置document.domain实现跨域的注意点分析
May 21 Javascript
简单介绍JavaScript中字符串创建的基本方法
Jul 07 Javascript
avalon js实现仿微博拖动图片排序
Aug 14 Javascript
javascript 中模板方法单例的实现方法
Oct 17 Javascript
关于jquery layui弹出层的使用方法
Apr 21 jQuery
你点的 ES6一些小技巧,请查收
Apr 25 Javascript
JavaScript如何获取一个元素的样式信息
Jul 29 Javascript
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
Oct 21 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中的Session及对Session有效期的控制
2016/01/08 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
Jquery显示、隐藏元素以及添加删除样式
2013/08/09 Javascript
javascript四舍五入函数代码分享(保留后几位)
2013/12/10 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
2014/11/26 Javascript
JavaScript保留关键字汇总
2015/12/01 Javascript
jQuery.deferred对象使用详解
2016/03/18 Javascript
轻松掌握JavaScript状态模式
2016/09/07 Javascript
微信小程序 下拉菜单简单实例
2017/04/13 Javascript
浅谈Vue.nextTick 的实现方法
2017/10/25 Javascript
vue引用js文件的多种方式(推荐)
2018/05/17 Javascript
使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
2018/10/23 Javascript
解决Layui中layer报错的问题
2019/09/03 Javascript
js实现滚动条自动滚动
2020/12/13 Javascript
[01:05]DOTA2完美大师赛趣味视频之选手教你打职业
2017/11/23 DOTA
编写简单的Python程序来判断文本的语种
2015/04/07 Python
python实现将英文单词表示的数字转换成阿拉伯数字的方法
2015/07/02 Python
python实现爬虫下载美女图片
2015/07/14 Python
Python3实现发送QQ邮件功能(附件)
2020/12/23 Python
查看Django和flask版本的方法
2018/05/14 Python
Python中的单行、多行、中文注释方法
2018/07/19 Python
python 自定义异常和异常捕捉的方法
2018/10/18 Python
python实现诗歌游戏(类继承)
2019/02/26 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
2020/02/25 Python
利用python在excel中画图的实现方法
2020/03/17 Python
通过python 执行 nohup 不生效的解决
2020/04/16 Python
德国EGOIST网店:销售畅销的设计师品牌
2017/04/18 全球购物
Big Green Smile德国网上商店:提供各种天然产品
2018/05/23 全球购物
什么是岗位职责
2013/11/12 职场文书
函授毕业生自我鉴定范文
2014/03/25 职场文书
高三上学期学习自我评价
2014/04/23 职场文书
理发店策划方案
2014/06/05 职场文书
广告业务员岗位职责
2015/02/13 职场文书
Python中OpenCV实现简单车牌字符切割
2021/06/11 Python
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL
Golang map映射的用法
2022/04/22 Golang