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 相关文章推荐
WEB高性能开发之疯狂的HTML压缩
Jun 19 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
Aug 25 Javascript
jquery validate和jquery form 插件组合实现验证表单后AJAX提交
Aug 26 Javascript
深入学习JavaScript的AngularJS框架中指令的使用方法
Mar 05 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
May 25 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
Dec 31 Javascript
jQuery实现复制到粘贴板功能
Feb 11 Javascript
VueRouter导航守卫用法详解
Dec 25 Javascript
webpack4+react多页面架构的实现
Oct 25 Javascript
改变layer confirm弹窗按钮的颜色方法
Sep 12 Javascript
JS实现灯泡开关特效
Mar 30 Javascript
如何基于jQuery实现五角星评分
Sep 02 jQuery
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页面编码的两种方法示例介绍
2014/03/03 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
学习ExtJS Panel常用方法
2009/10/07 Javascript
jQuery hover 延时器实现代码
2011/03/12 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
js 字符串转换成数字的三种方法
2013/03/23 Javascript
JavaScript脚本库编写的方法
2015/12/09 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
20分钟成功编写bootstrap响应式页面 就这么简单
2016/05/12 Javascript
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
socket.io与pm2(cluster)集群搭配的解决方案
2017/06/02 Javascript
vue-cli项目优化方法- 缩短首屏加载时间
2018/04/01 Javascript
python实现迭代法求方程组的根过程解析
2019/11/25 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
React学习之JSX与react事件实例分析
2020/01/06 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
[48:31]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第一场 2月2日
2021/03/11 DOTA
快速实现基于Python的微信聊天机器人示例代码
2017/03/03 Python
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
Python基于pyCUDA实现GPU加速并行计算功能入门教程
2018/06/19 Python
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
Android笔试题总结
2014/11/29 面试题
时尚休闲吧创业计划书
2014/01/25 职场文书
户外婚礼策划方案
2014/02/08 职场文书
新教师培训方案
2014/06/08 职场文书
查摆剖析材料范文
2014/09/30 职场文书
80后婚前协议书范本
2014/10/24 职场文书
检讨书范文2000字
2015/01/28 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
小学体育教学随笔
2015/08/14 职场文书
800字作文之大雪
2019/12/04 职场文书
python 制作一个gui界面的翻译工具
2021/05/14 Python
Vue vee-validate插件的简单使用
2021/06/22 Vue.js