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 相关文章推荐
一段效率很高的for循环语句使用方法
Aug 13 Javascript
菜鸟javascript基础资料整理2
Dec 06 Javascript
jquery 检测元素是否存在的实例代码
Nov 19 Javascript
通过js来制作复选框的全选和不选效果
May 22 Javascript
使用jQuery实现星级评分代码分享
Dec 09 Javascript
jQuery类选择器用法实例
Dec 23 Javascript
JavaScript获取网页支持表单字符集的方法
Apr 02 Javascript
jQuery查看选中对象HTML代码的方法
Jun 17 Javascript
js中innerText/textContent和innerHTML与target和currentTarget的区别
Jan 21 Javascript
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
Apr 29 Javascript
浅谈Vue.set实际上是什么
Oct 17 Javascript
在vue中使用console.log无效的解决
Aug 09 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
这东西价格,可以买几台TECSUN S-2000
2021/03/02 无线电
php通过COM类调用组件的实现代码
2012/01/11 PHP
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
php中AES加密解密的例子小结
2014/02/18 PHP
两款万能的php分页类
2015/11/12 PHP
PHP读书笔记整理_结构语句详解
2016/07/01 PHP
YII框架实现自定义第三方扩展操作示例
2019/04/26 PHP
激活 ActiveX 控件
2006/10/09 Javascript
Javascript-Mozilla和IE中的一个函数直接量的问题分析
2007/08/12 Javascript
起点页面传值js,有空研究学习下
2010/01/25 Javascript
extjs之去除s.gif的影响
2010/12/25 Javascript
使用js修改客户端注册表的方法
2013/08/09 Javascript
jQuery插件ajaxFileUpload实现异步上传文件效果
2015/04/14 Javascript
JQuery核心函数是什么及使用方法介绍
2016/05/03 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
2016/05/12 Javascript
jquery pagination分页插件使用详解(后台struts2)
2017/01/22 Javascript
vue.js中Vue-router 2.0基础实践教程
2017/05/08 Javascript
静态页面实现 include 引入公用代码的示例
2017/09/25 Javascript
Python递归遍历列表及输出的实现方法
2015/05/19 Python
python3 图片referer防盗链的实现方法
2018/03/12 Python
python redis 删除key脚本的实例
2019/02/19 Python
pyqt5与matplotlib的完美结合实例
2019/06/21 Python
python画图把时间作为横坐标的方法
2019/07/07 Python
django 基于中间件实现限制ip频繁访问过程详解
2019/07/30 Python
通过实例简单了解Python中yield的作用
2019/12/11 Python
Python谱减法语音降噪实例
2019/12/18 Python
python mysql中in参数化说明
2020/06/05 Python
python要安装在哪个盘
2020/06/15 Python
python适合做数据挖掘吗
2020/06/16 Python
详解如何在PyCharm控制台中输出彩色文字和背景
2020/08/17 Python
python 进程池pool使用详解
2020/10/15 Python
贝佳斯官方网站:Borghese
2020/05/08 全球购物
经典促销广告词大全
2014/03/19 职场文书
会计实训报告范文
2014/11/04 职场文书
2015年部门工作总结范文
2015/03/31 职场文书
Django一小时写出账号密码管理系统
2021/04/29 Python