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 相关文章推荐
jquery方法+js一般方法+js面向对象方法实现拖拽效果
Aug 30 Javascript
删除节点的jquery代码
Jan 13 Javascript
浅析Node.js查找字符串功能
Sep 03 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
Sep 01 Javascript
javascript图片滑动效果实现
Jan 28 Javascript
JS 拦截全局ajax请求实例解析
Nov 29 Javascript
JS实现太极旋转思路分析
Dec 09 Javascript
深入理解Angularjs向指令传递数据双向绑定机制
Dec 31 Javascript
详解Angular4中路由Router类的跳转navigate
Jun 09 Javascript
js中Object.defineProperty()方法的不详解
Jul 09 Javascript
vue弹窗插件实战代码
Sep 08 Javascript
vue 中Virtual Dom被创建的方法
Apr 15 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基础知识:类与对象(1)
2006/12/13 PHP
php自动获取字符串编码函数mb_detect_encoding
2011/05/31 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
PHP7移除的扩展和SAPI
2021/03/09 PHP
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
jquery ajax post提交数据乱码
2013/11/05 Javascript
JavaScript使用cookie记录临时访客信息的方法
2015/04/07 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
详解javascript中原始数据类型Null和Undefined
2015/12/17 Javascript
plupload+artdialog实现多平台上传文件
2016/07/19 Javascript
vue2组件实现懒加载浅析
2017/03/29 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
2017/04/13 Javascript
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
详解nodejs 开发企业微信第三方应用入门教程
2019/03/12 NodeJs
js数组中去除重复值的几种方法
2020/08/03 Javascript
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
Python使用scrapy采集时伪装成HTTP/1.1的方法
2015/04/08 Python
实例Python处理XML文件的方法
2015/08/31 Python
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
python爬取音频下载的示例代码
2020/10/19 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
2020/11/25 Python
几个CSS3的flex弹性盒模型布局的简单例子演示
2016/05/12 HTML / CSS
英国领先的NHS批准的在线药店:Pharmacy2U
2017/01/06 全球购物
阿里云:Aliyun.com
2017/02/15 全球购物
Magee 1866官网:Donegal粗花呢外套和大衣专家
2019/11/01 全球购物
优秀导游先进事迹材料
2014/01/25 职场文书
无房证明范本
2014/09/17 职场文书
房产销售独家委托书范本
2014/10/01 职场文书
工作作风建设心得体会
2014/10/22 职场文书
廉政承诺书范文
2015/04/28 职场文书
导游词之青岛太清宫
2019/12/13 职场文书
golang中字符串MD5生成方式总结
2021/07/04 Golang
SQL实现LeetCode(177.第N高薪水)
2021/08/04 MySQL
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python