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下给元素添加事件的方法与代码
Aug 13 Javascript
jQuery技巧总结
Jan 01 Javascript
在JavaScript里嵌入大量字符串常量的实现方法
Jul 07 Javascript
解析JSON对象与字符串之间的相互转换
Dec 18 Javascript
jquery下div 的resize事件示例代码
Mar 09 Javascript
JavaScript闭包函数访问外部变量的方法
Aug 27 Javascript
AngularJS入门教程(零):引导程序
Dec 06 Javascript
js实现图片和链接文字同步切换特效的方法
Feb 20 Javascript
JavaScript学习小结(7)之JS RegExp
Nov 29 Javascript
jQuery对html元素的取值与赋值实例详解
Dec 18 Javascript
纯JS焦点图特效实例(可一个页面多用)
Dec 07 Javascript
详解vue-router 路由元信息
Sep 13 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
一道求$b相对于$a的相对路径的php代码
2010/08/08 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
解析 thinkphp 框架中的部分方法
2017/05/07 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
通过jquery还原含有rowspan、colspan的table的实现方法
2012/02/10 Javascript
代码获取历史上的今天发生的事
2014/04/11 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
PHP 数组current和next用法分享
2015/03/05 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
AngularJS中$interval的用法详解
2016/02/02 Javascript
jQuery前端开发35个小技巧
2016/05/24 Javascript
Nodejs中解决cluster模块的多进程如何共享数据问题
2016/11/10 NodeJs
微信小程序实现文字无限轮播效果
2018/12/28 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
2019/08/14 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
python批量下载图片的三种方法
2013/04/22 Python
python操作摄像头截图实现远程监控的例子
2014/03/25 Python
python实现DES加密解密方法实例详解
2015/06/30 Python
Python压缩解压缩zip文件及破解zip文件密码的方法
2015/11/04 Python
分享python数据统计的一些小技巧
2016/07/21 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
python实现名片管理系统项目
2019/04/26 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
2020/02/27 Python
opencv-python的RGB与BGR互转方式
2020/06/02 Python
Python函数的迭代器与生成器的示例代码
2020/06/18 Python
用pushplus+python监控亚马逊到货动态推送微信
2021/01/29 Python
印度在线购物网站:Paytmmall
2019/07/24 全球购物
回馈慈善的设计师太阳镜:DIFF eyewear
2019/10/17 全球购物
丝芙兰墨西哥官网:Sephora墨西哥
2020/05/30 全球购物
运动会入场词50字
2014/02/20 职场文书
国培远程培训感言
2014/03/08 职场文书
辞职书格式样本
2015/02/26 职场文书
户外拓展训练感想
2015/08/07 职场文书
工作违纪的检讨书范文
2019/07/09 职场文书
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL